是否可以停止尝试catch返回null

时间:2014-06-04 20:27:59

标签: java try-catch defensive-programming

如果有人打电话给我的方法,我想防御性地处理这个问题。通常我只返回null

我决定实施try catch,但看起来我最终还是会回归null

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

示例代码,在Stack类上使用peek

    public T peek()
    {
        T temp = null;

        try
        {
            temp = array[size]; 
        }

        catch(Exception e)
        {
        }

        return temp;
    }

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

对于这种情况,我是否应该为try catch烦恼?我很想这样做:

if(isEmpty())
   return null;

如果堆栈不为空,我想返回元素。如果堆栈 为空,那么如果我使用try-catch,我可以避免返回null吗?

3 个答案:

答案 0 :(得分: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 */
}

答案 1 :(得分:1)

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

 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>(); 

答案 2 :(得分:1)

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

如果您不喜欢null的安全性,可以使用Java 8或库中的Optional。已检查的例外具有类似的安全性,但在此处不合适。