什么是 NullPointerException,我该如何修复它?

什么是 Null Pointer Exceptions ( java.lang.NullPointerException) 以及导致它们的原因是什么?

可以使用哪些方法/工具来确定原因,以便您阻止异常导致程序过早终止?


文章来源地址https://www.toymoban.com/diary/problem/261.html

Java 中有两种主要类型的变量:

  1. 原语:包含数据的变量。如果您想操作原始变量中的数据,您可以直接操作该变量。按照惯例,基本类型以小写字母开头。例如类型变量int or char是原语。

  2. References:包含 an 的内存地址的变量,Object 即引用 Object. 如果你想操作 Object 引用变量引用的对象,你必须取消引用它。取消引用通常需要使用.来访问方法或字段,或者使用 [ 来索引数组。按照惯例,引用类型通常用以大写字母开头的类型表示。例如,类型变量 Object 是引用。


考虑以下代码,您在其中声明了一个原始类型的变量 int 并且不对其进行初始化:

int x;int y = x + x;

这两行会使程序崩溃,因为没有指定值

这两行会使程序崩溃,因为没有指定值 ,而我们正试图使用 x 的值来指定 y。所有原语在被操作之前都必须被初始化为一个可用的值。


现在事情变得有趣了。引用变量可以设置为 null我没有引用任何东西”。null如果您以这种方式显式设置引用变量,或者引用变量未初始化且编译器未捕获它(Java 会自动将变量设置为null),则可以获得引用变量中的值。


如果引用变量由您显式设置或通过 Java 自动设置为 null,并且您尝试取消引用它,您会得到一个NullPointerException.


( NullPointerExceptionNPE) 通常发生在声明变量但未创建对象并将其分配给变量时,然后再尝试使用变量的内容。所以你引用了一些实际上不存在的东西。


采取以下代码:

Integer num;
num = new Integer(10);


第一行声明了一个名为 的变量num,但它实际上还没有包含一个引用值。由于您尚未说明要指向什么,因此 Java 将其设置为null.


在第二行中,new关键字用于实例化(或创建)类型的对象Integer,并将引用变量num分配给该Integer对象。


如果您在创建对象num 之前尝试取消引用,您会得到一个NullPointerException. 在最普通的情况下,编译器会发现问题并让您知道“ num may not have been initialized,”,但有时您可能会编写不直接创建对象的代码。


例如,您可能有如下方法:

public void doSomething(SomeObject obj) {
   // Do something to obj, assumes obj is not null
   obj.myMethod();}

在这种情况下,您不是在创建对象obj,而是假设它是在doSomething()调用方法之前创建的。注意,可以这样调用方法:

doSomething(null);

在这种情况下,

在这种情况下,obj是null,语句obj.myMethod()将抛出一个NullPointerException。


如果该方法打算像上述方法一样对传入的对象执行某些操作,则抛出是合适的,NullPointerException因为这是程序员错误,程序员将需要该信息进行调试。

// Throws an NPE with a custom error message if obj is null
Objects.requireNonNull(obj, "obj must not be null");


除了作为NullPointerException方法逻辑结果抛出的 s 之外,您还可以检查方法参数的null值并通过在方法开头附近添加如下内容来显式抛出 NPE:


请注意,在您的错误消息中清楚说明哪个对象不能是很有帮助的null。验证这一点的好处是 1) 您可以返回自己更清晰的错误消息,以及 2) 对于您知道的方法的其余部分,除非obj重新分配,否则它不为 null 并且可以安全地取消引用。


或者,在某些情况下,该方法的目的不仅仅是对传入的对象进行操作,因此 null 参数可能是可以接受的。在这种情况下,您需要检查空参数并采取不同的行为。您还应该在文档中解释这一点。例如,doSomething()可以写成:

/**
  * @param obj An optional foo for ____. May be null, in which case
  *  the result will be ____.
  */public void doSomething(SomeObject obj) {
    if(obj == null) {
       // Do something
    } else {
       // Do something else
    }}


最后,如何使用 Stack Trace 查明异常和原因

【可以使用哪些方法/工具来确定原因,以便您阻止异常导致程序过早终止?】

带有 find bugs 的 Sonar 可以检测 NPE。 sonar能否动态捕获JVM引起的空指针异常


现在 Java 14 添加了一个新的语言特性来显示 NullPointerException 的根本原因。自 2006 年以来,此语言功能已成为 SAP 商业 JVM 的一部分。


在 Java 14 中,以下是 NullPointerException 异常消息的示例:


【在线程“main”中 java.lang.NullPointerException:无法调用“java.util.List.size()”,因为“list”为空】


NullPointerException导致 a发生的情况列表

NullPointerException以下是Java 语言规范直接*提到的所有发生 a 的情况:

  • 访问(即获取或设置)空引用的实例字段。(静态字段不算数!)

  • 调用空引用的实例方法。(静态方法不算!)

  • throw null;

  • 访问空数组的元素。

  • 同步空 -synchronized (someNullReference) { ... }

  • NullPointerException如果其操作数之一是装箱的空引用,则任何整数/浮点运算符都可以抛出 a

  • NullPointerException如果装箱值为 null,则取消装箱转换将抛出 a 。

  • 调用super空引用会抛出一个NullPointerException如果您感到困惑,这是在谈论合格的超类构造函数调用:

class Outer {
    class Inner {}}class ChildOfInner extends Outer.Inner {
    ChildOfInner(Outer o) { 
        o.super(); // if o is null, NPE gets thrown
    }}
  • 使用for (element : iterable)循环遍历空集合/数组。

  • switch (foo) { ... }(无论是表达式还是语句)可以抛出一个NullPointerExceptionwhen foois null。

  • foo.new SomeInnerClass()NullPointerException当为空时抛出一个foo

  • 形式的方法引用name1::name2or primaryExpression::namethrows a NullPointerExceptionwhen evaluated when name1or primaryExpressionevaluates to null.

    JLS here 的一条注释说,someInstance.someStaticMethod()不会抛出 NPE,因为它someStaticMethod是静态的,但someInstance::someStaticMethod仍然会抛出 NPE!


到此这篇关于什么是 NullPointerException,我该如何修复它?的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/diary/problem/261.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用
如何防止PHP中的 SQL 注入?
上一篇 2023年08月19日 16:46
下一篇 2023年08月19日 16:46

相关文章

  • PMP考试 I 我该如何高效准备?

    可把PMP考试当成一个项目,先规划出此项目的生命周期,进行严格的生命周期管理和阶段治理工作,可简单分成3个阶段(1个月每阶段): 阶段一:找到感觉 第一阶段你需参加完成35个课时的PMP®培训,是老师带着你找PMBOK®指南所有知识领域的感觉,注意一定要课前预习、课

    2024年02月08日
    浏览(38)
  • HTTP代理出现503错误是什么意思,要如何修复?

    在使用HTTP代理的时候,我们常常会遇到各种问题,想要解决,就需要根据返回码来解决。今天我们来说说,遇到HTTP 代理出现 503 服务不可用错误要怎么办,该如何解决呢? 首先,我们要明白,HTTP 代理出现503错误,意味着代理服务器无法连接到目标服务器或目标服务器出

    2024年02月03日
    浏览(52)
  • 什么是HTTP500内部服务器错误,要如何修复

    HTTP 500内部服务器错误是指在服务器端处理请求时发生了错误,导致无法完成请求并返回错误信息。这种错误通常由服务器端的程序错误、数据库连接问题、权限问题或配置问题引起。下面将详细介绍HTTP 500错误的常见原因及解决方案。 1.服务器端程序错误 如果服务器端程序

    2024年02月06日
    浏览(47)
  • 2023年测试岗,自动化测试我该如何进阶?卷出方向...

    先编程语言打好基础 Python自动化测试:https://www.bilibili.com/video/BV16G411x76E/ 语言选择上Java或者Python都是可以的,可以先从Python入手,之后再开始Java。在学习语言的过程中,一定要忘掉你是做测试的,把自己当成开发,系统的去学相关的编程知识,因为语言水平的高低,很大程

    2023年04月26日
    浏览(37)
  • 计算机丢失msvcp110.dll是什么意思?如何修复?

    在日常使用电脑的时候,有时候会遇到一些使用问题。 比如,有一次遇到了这样一个问题。 那就是,因为“msvcp110.dll”这个文件丢失,有些软件安装不了。 计算机丢失msvcp110.dll是什么意思?该如何修复呢?   删除文件:可能是因为误操作或病毒感染而导致文件被删除。 损

    2024年02月12日
    浏览(77)
  • 在yolov5的detect中我该如何调用第三方摄像头?

    要在 YOLOv5 的 detect 中调用第三方摄像头,你可以使用 OpenCV 库中的 VideoCapture 类来读取摄像头的视频流。 你可以这样做: 首先,安装 OpenCV 库。 然后,在你的代码中包含以下头文件: 接下来,创建一个 VideoCapture 对象,用于获取摄像头的视频流: 然后,打开摄像头,并检查

    2024年02月12日
    浏览(45)
  • macos中回退键是Command+shift+z,我该如何改成Command+y?

    在使用 macOS 操作系统时,回退键的默认快捷键是 Command+Shift+Z。然而,对于一些用户来说,这种组合键可能不太方便,因此他们希望将其改为其他组合键,例如 Command+Y。如果你也想更改回退键的快捷键,请按照以下步骤进行操作。 操作如下,打开系统设置-键盘   m a c 技 巧

    2024年02月11日
    浏览(37)
  • 单元测试-java.lang.NullPointerException

    报错信息 java.lang.NullPointerException 空指针异常 空对象引用 来源 对 Controller 层进行单元测试,解决完Spring上下文报错后继续报错。 解决 在测试方法执行前要 为字段完成对象的注入 ,否则就报空指针异常。 测试例子 不完整启动Spring框架 完整启动Spring框架 避免手动注入字段。

    2024年02月03日
    浏览(60)
  • java.lang.NullPointerException: null

    错误提示的大意是:空指针异常。说明报错位置缺少信息或者是数据对应不上。 知道大概意思后现在开始排查,点击 Debug ,就是下图的这个按钮  然后根据前面提示的报错行,再打开项目运行。  接着看报错信息,它说这个类型等于null,但是查看该页面,发现上述页面没有

    2024年02月15日
    浏览(44)
  • 上一任留下的 Eureka,我该如何提升她的性能和稳定性(含数据比对)?

    开篇:一次小小的技术讨论 Aliware 周末的时候,和一位在国内某互联网公司负责运维的朋友聊天,由于工作相关,刚好聊到了公司项目中微服务架构这块的一些问题,他们公司的微服务架构使用的是业界比较常用的 Spring Cloud Netflix 那一套作为底座,有专门的同学负责运维一套

    2024年02月04日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包