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

我决定实施一个 try catch 但看起来我刚刚回来 null 反正。

我可以写我的 try 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;

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

有帮助吗?

解决方案

该方法必须返回某些内容或抛出异常。如果您有无界泛型类型,则无法使用空对象模式之类的东西,因此选项将返回 null, ,返回包含的内容 T 喜欢 Optional<T>, ,或抛出异常。

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

其他提示

这就是我处理问题的方法。通过在 peek 函数中抛出异常,将处理该异常的职责交给调用者。为什么?因为我希望一个错误引起尽可能大的爆炸。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 */
}

很难想象 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.

编辑

或者,使用 选项 monad - 以及类似的东西,

 if (array != null && array.length > size) {
   return new Some<T>(array[size - 1]); // assuming your size starts at 1
 }
 return new None<T>(); 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top