我知道不建议捕获NPE,但是NPE是一个方法,其返回值是基于NPE来源的变量的布尔值。
代码是这样的:
public static boolean isStale() {
return a.get(); //a==null causing NPE
}
就我而言,如果没有a的信息,我真的不知道该返回什么。 我该怎么办?如果有的话,我应该扔什么样的例外?
编辑:
1.返回true或false将是不准确的,因为结果实际上取决于a。中的信息。
答案 0 :(得分:5)
没有理由阻止您的代码抛出异常。只考虑一下你的情况:你自己说你的方法的行为没有在a == null
的情况下定义,那你为什么要处理呢?它只会导致奇怪的行为,并且您的用户可能会惊讶于他们的代码失败或在某处产生意外结果,而他们对您的API的调用很顺利。
例外是专为解决此类问题而设计的,因此请充分利用它。您可以抛出一个新的自定义异常来添加一些特定于API的语义,或者让NPE传播给调用者。
例如:
public static boolean isStale() {
if (a == null) throw new IllegalStateException("a should not be null");
return a.get();
}
但是,你更有可能在构造函数中这样做(因为我认为a
是一个属性)。在构造函数中,我会选择IllegalArgumentException
。
答案 1 :(得分:1)
首先,您需要问自己:a
null
是否正常?
如果yes
,则抛出异常很少是一个好主意。实际上只有在出现意外情况时才会抛出异常。那么你真的需要决定这对你的程序意味着什么。在这种情况下返回一些默认值是否有意义?
return a == null ? false : a.get(); // return false as a default value?
如果no
(更有可能):
...然后提出以下问题: 为什么 我获得null
值?
如果是因为您编写了一个错误:那么您不需要做任何事情。让它抛出一个NullPointerException
。抓住异常并假装一切正常是没有意义的,如果清楚的话,你的程序中的基本不变量已被打破。最好让它尽早抛出异常并将精力集中在尽快理解和修复bug上。尝试处理异常只会导致程序在其他更意想不到的时间点失败,并且将变得更加难以调试。
另一方面,如果是因为某些外部实体为您提供了您无法控制的错误数据:那么这可能是抛出可用于提供更有意义的错误的自定义异常的好例子向用户或开发者发送消息。但即使在这种情况下,让a
更多地验证null
值“上游”并让它尽早抛出异常可能是一个更好的主意。担心isStale()
方法的合同中不应该担心a
价值的正确性。
有趣的阅读,面向C#,但这些原则同样适用于Java:Vexing exceptions。
答案 2 :(得分:0)
在使用确保 a
不是null
之前,不需要抛出任何异常,使用简单的条件语句:< / p>
public static boolean isStale() {
a!=null ? return a.get() : return false;
}
如果返回false将无关紧要,您只需将方法的返回类型更改为String并返回警告或任何其他重要消息:
public static String isStale() {
a!=null ? return a.get().toString() : return "NULL";
}
看看这个: Best approach to converting Boolean object to string in java
答案 3 :(得分:0)
这取决于isStale()确定的内容。您可以尝试/捕获此方法并捕获NullPointerException。如果你真的无法处理a
为空,我不相信这违反了最佳做法。如果a
为null,您也可以实例化新的a
,或者抛出您自己的异常。