是否可以阻止 try catch 返回 null
-
21-12-2019 - |
题
如果有人调用我的方法,我想防御性地处理这个问题。通常我只是回来 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>();
不隶属于 StackOverflow