如果有人调用我的方法,我想防御性地处理这个问题。通常我只返回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吗?
我是这样处理这个问题的。通过在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 */
}
该方法必须返回一些东西或抛出异常。如果你有一个无界泛型类型,那么像null对象模式这样的东西就不能使用,所以选项是返回null
,返回包含T
的东西,比如Optional<T>
,或者抛出一个异常。
如果你不喜欢null
的安全性,你可以使用Optional
,无论是来自Java 8还是一个库。检查异常具有类似的安全性,但在这里不合适。
很难想象array[size]
会抛出异常,除非数组为null或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单引号,比如
if (array != null && array.length > size) {
return new Some<T>(array[size - 1]); // assuming your size starts at 1
}
return new None<T>();