如果有人打电话给我的方法,我想防御性地处理这个问题。通常我只返回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吗?
答案 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
。已检查的例外具有类似的安全性,但在此处不合适。