【问题标题】:try/catch vs if/else throwing NullPointerExceptiontry/catch 与 if/else 抛出 NullPointerException
【发布时间】:2017-04-07 03:34:53
【问题描述】:

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

【问题讨论】:

  • 没有,我会抛出IllegalArgumentException,但我更喜欢第一个
  • 老实说...我永远不会想要手动触发 NPE,如果这是一种方法,我宁愿在那里抛出 IllegalArgumentException
  • Effective Java 为 NPE 提供建议,但我也支持 Kevin 和 Pau。
  • 这里的另一件事是你不应该记录和重新抛出。这可能会导致针对同一异常的多条消息。如果你要扔,那就扔吧。如果您想添加有关原因的额外信息,请在消息中引发新异常。

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


【解决方案1】:

在 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");

第二点:一般规则是要么抛出异常要么记录错误,决不能同时发生。在这种情况下,您应该选择 throw,并且应该只有一个中心位置,覆盖整个工作单元,捕获并记录所有异常。

【讨论】:

  • 但是在具有返回值的方法中添加 if/else 时我该怎么办? (某些特定对象)在这种情况下我应该返回什么来确保出现错误?
  • 当你抛出异常时,你不会返回任何东西。
  • 对,我知道,但你说我不应该在记录时抛出异常......
  • 你不应该登录,直接扔。
【解决方案2】:

首先,在这种情况下,我会使用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");
    }

    ....

}

那么你只需要这样使用它(它将样板代码减少到一行):

Assert.isNotNull(parameter);

【讨论】:

【解决方案3】:

第一个代码看起来很合适,因为您已经测试了该值,并且在 if 条件失败时可以给出 null 结果。

【讨论】:

    【解决方案4】:

    如果您尝试验证参数不为空,我会推荐 Guava's Preconditions,特别是 checkNotNull。

    Preconditions.checkNotNull(parameter, "Please specify a value for parameter");
    

    如果参数为空,它会抛出一个带有指定消息的 NPE。

    【讨论】:

      猜你喜欢
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多