try / catch vs if / else抛出NullPointerException

时间:2016-11-23 08:16:47

标签: java if-statement exception try-catch null-pointer

当你想抛出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;
}

4 个答案:

答案 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。