当你想抛出NullPointerException时我会选择什么?
1)
if(parameter != null){
// do something
} else {
Log.error("Reason for Exception.");
throw new NullPointerException();
}
2)
try{
// do something
} catch (NullPointerException npe) {
Log.error("Reson for Exception.");
throw npe;
}
答案 0 :(得分:3)
在2)你不会确切地知道哪个表达式投掷了NPE。 1)很清楚为什么你要抛出异常。如有必要,可以进行多项单独的空检查。
但是,您的第一种方法应该重写:
if (arg == null) {
throw new IllegalArgumentException("arg is null");
}
... just go on with the method, no else block needed
如果你至少在Java 7上:
Objects.requireNonNull(arg, "arg is null");
第二点:一般规则是抛出异常或记录错误,而不是同时抛出异常。在这种情况下,您应该选择抛出,并且应该只有一个中心位置,覆盖整个工作单元,其中捕获并记录所有异常。
答案 1 :(得分:1)
首先,在这种情况下,我会使用IllegalArgumentException
而不是NullPointerException
。但是在两者之间做出选择的情况下,我更喜欢第一个,因为它很清楚。
否则,为了避免像这样的样板代码,在我看来这让它变得丑陋。我会使用Assert
类检查它。您可以使用自己的Assert类或使用一些已完成的类,如Spring Assert
等。
你的Assert
课程会是这样的:
public Assert {
public static void isNotNull(Object object) {
if(null == object)
throw new IllegalArgumentException(".. must be not null");
}
....
}
然后你只需要像那样使用它(它将boilperplate代码减少到一行):
Assert.isNotNull(parameter);
答案 2 :(得分:1)
第一个代码看起来合适,因为您已经测试了该值,并且在if条件失败时可以给出null结果。
答案 3 :(得分:-1)
如果您尝试验证参数不为null,我建议Guava's Preconditions,特别是checkNotNull。
Preconditions.checkNotNull(parameter, "Please specify a value for parameter");
如果参数为null,则抛出带有指定消息的NPE。