什么是 NullPointerException?

注:本文转自《白煮蛋的博客》 博客地址:http://www.baizhud.com/icon-default.png?t=M1H3http://www.baizhud.com/

JavaDocs是一个很好的起点。他们涵盖了以下内容:

当应用程序在需要对象的情况下尝试使用 null 时引发。这些包括:

  • 调用空对象的实例方法。
  • 访问或修改空对象的字段。
  • 将 null 的长度视为一个数组。
  • 访问或修改 null 的槽,就像它是一个数组一样。
  • 把 null 当作一个 Throwable 值来抛出。

应用程序应抛出此类的实例以指示空对象的其他非法使用。

根据 JLS,如果您尝试使用 null 引用synchronized,也会引发此异常:

<span style="background-color:var(--highlight-bg)"><span style="color:var(--highlight-color)"><code class="language-java">SynchronizedStatement:
    <span style="color:var(--highlight-keyword)">synchronized</span> ( Expression ) Block
</code></span></span>
  • 否则,如果 Expression 的值为 null,NullPointerException则抛出 a。

我如何解决它?

所以你有一个NullPointerException. 你如何解决它?让我们举一个简单的例子,它抛出一个NullPointerException

<span style="background-color:var(--highlight-bg)"><span style="color:var(--highlight-color)"><code class="language-java"><span style="color:var(--highlight-keyword)">public</span> <span style="color:var(--highlight-keyword)">class</span> <span style="color:var(--highlight-literal)">Printer</span> {
    <span style="color:var(--highlight-keyword)">private</span> String name;

    <span style="color:var(--highlight-keyword)">public</span> <span style="color:var(--highlight-keyword)">void</span> <span style="color:var(--highlight-literal)">setName</span>(String name) {
        <span style="color:var(--highlight-literal)">this</span>.name = name;
    }

    <span style="color:var(--highlight-keyword)">public</span> <span style="color:var(--highlight-keyword)">void</span> <span style="color:var(--highlight-literal)">print</span>() {
        printString(name);
    }

    <span style="color:var(--highlight-keyword)">private</span> <span style="color:var(--highlight-keyword)">void</span> <span style="color:var(--highlight-literal)">printString</span>(String s) {
        System.out.println(s + <span style="color:var(--highlight-variable)">" ("</span> + s.length() + <span style="color:var(--highlight-variable)">")"</span>);
    }

    <span style="color:var(--highlight-keyword)">public</span> <span style="color:var(--highlight-keyword)">static</span> <span style="color:var(--highlight-keyword)">void</span> <span style="color:var(--highlight-literal)">main</span>(String[] args) {
        <span style="color:var(--highlight-namespace)">Printer</span> <span style="color:var(--highlight-variable)">printer</span> = <span style="color:var(--highlight-keyword)">new</span> <span style="color:var(--highlight-literal)">Printer</span>();
        printer.print();
    }
}
</code></span></span>

识别空值

第一步是准确识别导致异常的值。为此,我们需要进行一些调试。学习阅读堆栈跟踪很重要。这将向您显示引发异常的位置:

<span style="background-color:var(--highlight-bg)"><span style="color:var(--highlight-color)"><code class="language-java">Exception in thread <span style="color:var(--highlight-variable)">"main"</span> java.lang.NullPointerException
    at Printer.printString(Printer.java:<span style="color:var(--highlight-namespace)">13</span>)
    at Printer.print(Printer.java:<span style="color:var(--highlight-namespace)">9</span>)
    at Printer.main(Printer.java:<span style="color:var(--highlight-namespace)">19</span>)
</code></span></span>

在这里,我们看到在第 13 行(在printString方法中)抛出了异常。查看该行并通过添加日志记录语句或使用调试器检查哪些值为空。我们发现它s是空的,调用它的length方法会抛出异常。我们可以看到,当s.length()从方法中删除时,程序停止抛出异常。

跟踪这些值的来源

接下来检查该值的来源。通过跟踪方法的调用者,我们看到在方法s中传入了with ,并且为null。printString(name)print()this.name

跟踪应该设置这些值的位置

在哪里this.name设置?在setName(String)方法中。通过更多的调试,我们可以看到这个方法根本没有被调用。如果调用了该方法,请务必检查这些方法的调用顺序,并且 set 方法不会在print 方法之后调用。

这足以给我们一个解决方案:在调用printer.setName()之前添加一个调用printer.print()

其他修复

该变量可以有一个默认值(并且setName可以防止它被设置为空):

<span style="background-color:var(--highlight-bg)"><span style="color:var(--highlight-color)"><code class="language-java"><span style="color:var(--highlight-keyword)">private</span> <span style="color:var(--highlight-namespace)">String</span> <span style="color:var(--highlight-variable)">name</span> = <span style="color:var(--highlight-variable)">""</span>;
</code></span></span>

orprint方法printString可以检查 null,例如:

<span style="background-color:var(--highlight-bg)"><span style="color:var(--highlight-color)"><code class="language-java">printString((name == <span style="color:var(--highlight-literal)">null</span>) ? <span style="color:var(--highlight-variable)">""</span> : name);
</code></span></span>

或者您可以设计该类,使其name 始终具有非空值

<span style="background-color:var(--highlight-bg)"><span style="color:var(--highlight-color)"><code class="language-java"><span style="color:var(--highlight-keyword)">public</span> <span style="color:var(--highlight-keyword)">class</span> <span style="color:var(--highlight-literal)">Printer</span> {
    <span style="color:var(--highlight-keyword)">private</span> <span style="color:var(--highlight-keyword)">final</span> String name;

    <span style="color:var(--highlight-keyword)">public</span> <span style="color:var(--highlight-literal)">Printer</span>(String name) {
        <span style="color:var(--highlight-literal)">this</span>.name = Objects.requireNonNull(name);
    }

    <span style="color:var(--highlight-keyword)">public</span> <span style="color:var(--highlight-keyword)">void</span> <span style="color:var(--highlight-literal)">print</span>() {
        printString(name);
    }

    <span style="color:var(--highlight-keyword)">private</span> <span style="color:var(--highlight-keyword)">void</span> <span style="color:var(--highlight-literal)">printString</span>(String s) {
        System.out.println(s + <span style="color:var(--highlight-variable)">" ("</span> + s.length() + <span style="color:var(--highlight-variable)">")"</span>);
    }

    <span style="color:var(--highlight-keyword)">public</span> <span style="color:var(--highlight-keyword)">static</span> <span style="color:var(--highlight-keyword)">void</span> <span style="color:var(--highlight-literal)">main</span>(String[] args) {
        <span style="color:var(--highlight-namespace)">Printer</span> <span style="color:var(--highlight-variable)">printer</span> = <span style="color:var(--highlight-keyword)">new</span> <span style="color:var(--highlight-literal)">Printer</span>(<span style="color:var(--highlight-variable)">"123"</span>);
        printer.print();
    }
}
</code></span></span>

也可以看看:

我还是找不到问题

如果您尝试调试问题但仍然没有解决方案,您可以发布问题以获得更多帮助,但请确保包含您迄今为止尝试过的内容。至少,在问题中包含堆栈跟踪,并在代码中标记重要的行号。另外,请先尝试简化代码(请参阅SSCCE)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值