-2

如果有人调用我的方法,我想防御性地处理问题。通常我只是返回null

我决定实施 atry catch但看起来我最终还是会返回null

我可以这样写 mytry catch在方法结束时它不会返回null吗?

示例代码,peek用于 Stack 类。

    public T peek()
    {
        T temp = null;

        try
        {
            temp = array[size]; 
        }

        catch(Exception e)
        {
        }

        return temp;
    }

使用空堆栈调用时。它会返回null

那么我什至应该try catch为这种情况而烦恼吗?我很想这样做:

if(isEmpty())
   return null;

如果堆栈不为空,我想返回元素。如果堆栈空,那么如果我使用try-catch?

4

3 回答 3

2

这就是我解决问题的方式。通过在 peek 函数中抛出异常,将处理该异常的职责交给调用者。为什么?因为我希望一个错误引起尽可能大的爆炸。窥视方法也变小了。此外,正如您已经同意的那样,返回 null 是蹩脚的。

public T peek() throws IndexOutOfBoundsException
{   
  return array[size]; 
}

try
{
  T top = thestack.peek();
  /* Do something with that object */
}
catch(IndexOutOfBoundsException e)
{
  /* Do something else */
}
于 2014-06-04T20:42:18.043 回答
1

很难想象array[size]抛出异常,除非数组为空或大小超出数组长度。所以,你可以做这样的事情 -

 if (array != null && array.length > size) {
   return array[size - 1]; // assuming your size starts at 1
 }
 return null; // need to return something, if not null you need an option type.

编辑

或者,使用Option monad - 和类似的东西,

 if (array != null && array.length > size) {
   return new Some<T>(array[size - 1]); // assuming your size starts at 1
 }
 return new None<T>(); 
于 2014-06-04T20:31:56.033 回答
1

该方法必须返回一些东西或抛出一个异常。如果你有一个无界的泛型类型,那么就不能使用空对象模式之类的东西,所以选项是返回null,返回包含Tlike的东西Optional<T>,或者抛出一个异常。

如果您不喜欢 的安全性null,您可以使用OptionalJava 8 或库中的 。检查的异常具有类似的安全性,但在这里不合适。

于 2014-06-04T20:59:32.230 回答