在NullPointerException和IllegalArgumentException之间选择,以便在对象构造时发出错误信号

Sal*_*Sal 1 java exception nullpointerexception

我对Java中的最佳实践有疑问.我正在写一个类,它依赖于构造中的一个对象.实际上,如果在构造中传入的对象为null,则大多数功能都没有意义.我认为最好在对象构造中将null作为参数传递的情况下抛出异常,但我不知道在这种情况下最合适的异常是什么.我应该抛出NullPointer,IllegalArgument,Instatiation,甚至是Initialization异常.

我已经看到这些都在整个Java源代码库中使用,我似乎无法区分为什么在某些情况下使用NullPointer而在其他情况下使用IllegalArgument.我个人会认为如果在构造中传递了错误的参数,则应该发生一些初始化错误.

Jon*_*eet 5

首先,你绝对应该抛出异常.这只是正确的事情.

至于你是否应该扔IllegalArgumentException或者NullPointerException--Josh Bloch在Effective Java中讨论这个问题,并且总的来说这NullPointerException是一个合理的选择.我不完全确定我同意(我可能会选择IllegalArgumentException),但最终它不太重要:你不应该直接捕获这些异常中的任何一个,并且堆栈跟踪将告诉你无论如何都存在问题.

(遗憾的是Java没有相当于.NET的功能ArgumentNullException,这意味着它的确如此.)

就个人而言,我是番石榴Preconditions班的忠实粉丝:

public class Foo {
  private final Bar bar;

  public Foo(Bar bar) {
    this.bar = Preconditions.checkNotNull(bar);
  }
}
Run Code Online (Sandbox Code Playgroud)

(有时与静态导入一起使用checkNotNull.)

  • +1:没有什么能阻止你创建自己的`ArgumentNullException`.无论如何客户都不应该抓住它...... (2认同)