捕捉和抛出nullpointerexception的最佳做法?

Gur*_*epS 5 java nullpointerexception

捕获nullpointerexception似乎不是一个好主意.如果是这样的话,为什么它会被方法抛出?应该只是被Exception捕获?

另外,如果我遇到一个null参数(可以是像字符串这样的原始类型,也可以是带字段的类),我应该如何处理呢?(假设没有扔npe)?

谢谢

Pét*_*rök 14

这是一个运行时异常,因此不打算你的程序代码中,只有内心深处抓到[更新]在(或接近)的顶层或[/更新]由JVM.由于运行时异常发出严重问题(通常是严重的编程错误,配置/集成问题等),因此最好让它们传播到顶部,这通常会使整个线程失败.这给出了一个强烈的信号,即出现问题,需要尽快修复.

另请参阅捕获空指针异常代码嗅觉?.

另外,如果我遇到一个null [...]的参数,我该如何处理呢?

一般来说,扔NPE是可以的.但是,根据具体情况,您也可以考虑IllegalArgumentException使用断言.也可以看看


sna*_*ile 6

nullpointerexception通常表示程序员错误.如果你不期望这样的程序员错误,你将不会捕获空指针异常.例如,假设您使用一个类型为P的参数实现了一个方法myMethod.

void myMethod(P x)
Run Code Online (Sandbox Code Playgroud)

假设您不希望参数x为null.在这种情况下,您可能不会检查null.为什么?因为您假设正在使用您的方法的程序员将正确使用它并且不会传递null.在这种情况下,我不是说你应该或不应该检查是否为null.我只是想回答为什么有时一个方法抛出空指针异常并且不应该被捕获.原因如下:您的方法可能抛出空指针异常,因为有人没有正确使用它(传递null).使用您的方法的程序员可能知道如果方法使用错误,它可能会抛出nullpointerexcetption.但即使他使用您的方法错误,也不会捕获异常,因为每个人都认为该方法没有被滥用.

第二个问题:首先,String是一个Object,而不是一个原始类型.其次,原语不能为空(原语是整数,双精度,浮点数,字符,布尔值和其他一些).现在,如果您遇到一个null参数并且它不应该为null(换句话说,您收到了非法参数),您有一些选择:

  • 抛出IllegalArgumentException,指示参数为null,并且您的方法期望它不为null.
  • 什么都不做 假设您的方法正确使用(换句话说,假设没有程序员错误).
  • 使用断言:assert(x != null);

我个人不是防守编程的粉丝,通常更喜欢第二种选择.但是,如果我想确保我的变量有一些不变量,我正在使用断言.但这些只是我的习惯而其他人可能不同意.