在Java中优雅地避免NullPointerException

Yuv*_*dam 23 java coding-style nullpointerexception code-readability

考虑这一行:

if (object.getAttribute("someAttr").equals("true")) { // ....
Run Code Online (Sandbox Code Playgroud)

显然这条线是一个潜在的错误,属性可能是null,我们将得到一个NullPointerException.所以我们需要将它重构为以下两种选择之一:

第一种选择:

if ("true".equals(object.getAttribute("someAttr"))) { // ....
Run Code Online (Sandbox Code Playgroud)

第二种选择:

String attr = object.getAttribute("someAttr");
if (attr != null) {
    if (attr.equals("true")) { // ....
Run Code Online (Sandbox Code Playgroud)

第一个选项很难读,但更简洁,而第二个选项在意图上是明确的,但是很冗长.

在可读性方面,您更喜欢哪个选项?

vic*_*ugo 27

我一直都在用

if ("true".equals(object.getAttribute("someAttr"))) { // ....
Run Code Online (Sandbox Code Playgroud)

因为虽然阅读起来有点困难,但它的冗长程度要低得多,我认为它足够可读,所以你很容易习惯它

  • 我甚至认为这更难以阅读. (3认同)

laa*_*lto 18

在第二个选项中,您可以利用短路&&:

String attr = object.getAttribute("someAttr");
if (attr != null && attr.equals("true")) { // ....
Run Code Online (Sandbox Code Playgroud)

  • 嗯,有利于优化?相反,我认为这比选项1更具可读性. (7认同)
  • 这不是"优化",也不是可读性.我认为有两个if子句实际上远没有那么可读,因为你最终会得到比实际需要更多的嵌套块.双ifs也打开臭名昭着的"2ifs1else"错误的窗口:"if(a)if(b)print("a和b");否则print("not a and b"); (7认同)