什么是 Null Pointer Exceptions ( java.lang.NullPointerException ) 是什么原因造成的?

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

当你声明一个引用变量(即一个对象)时,你实际上是在创建一个指向一个对象的指针。 考虑以下代码,您在其中声明了一个原始类型的变量 int :

int x;
x = 10;

在本例中,变量 x 是  int Java 会为您将其初始化为 0 。 当你在第二行分配值 10 时,你的值 10 将写入 x 引用的内存位置。

但是,当你尝试声明引用类型时,会发生不同的事情。 采取以下代码:

Integer num;
num = new Integer(10);

第一行声明了一个名为 num , 但它实际上并不包含原始值。相反,它包含一个指针(因为类型是整数,它是一个引用类型)。 由于您还没有说要指向什么,Java 将其设置为   null , 这意味着 “ I am pointing to  nothing “.

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

NullPointerException (NPE) 发生在您声明一个变量但未创建对象并将其分配给该变量之前尝试使用该变量的内容(称为取消引用)。 所以你指向的东西实际上并不存在。

取消引用通常发生在使用 . 访问方法或字段,或使用   [ 索引数组。

如果你在创建对象 之前 尝试取消引用 num 则会收到  NullPointerException . 在最琐碎的情况下,编译器会发现问题并让你知道 “ num 可能尚未初始化 num may not have been initialized ,” 但有时你可能会编写不直接创建对象的代码。

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

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

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

doSomething(null);

在这种情况下, obj 为  null , 并且语句 obj.myMethod() 将抛出 NullPointerException .

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

除了由于方法的逻辑而引发的 NullPointerException之外,您还可以检查方法参数的 null 值并通过在方法的开头附近添加类似以下内容来显式抛出 NPE:

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

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

或者,可能存在方法的目的不仅仅是对传入的对象进行操作的情况,因此可以接受空参数。您需要检查 null parameter 并采取不同的行为。 您还应该在文档中解释这一点。 例如, 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}
}

什么是 Null Pointer Exceptions (java.lang.NullPointerException) ,是什么原因造成的?相关推荐

  1. 基本类型为空导致线上空指针异常问题 java.lang.NullPointerException: cannot unbox null value

    线上钉钉群突然报空指针异常,结合日志分析代码,如下: 报错信息:(含入参) reQueryDto={\"minAge\":null,\"maxAge\":26, ...

  2. java.lang.NullPointerException出现的几种原因及解决方案

    java.lang.NullPointerException是java编程中最常见的异常之一.任何使用java的人都有在java程序以及java web应用程序中看到java.lang.NullPoi ...

  3. 轻松搞定项目中的空指针异常Caused by: java.lang.NullPointerException: null

    轻松搞定项目中的空指针异常Caused by: java.lang.NullPointerException: null 参考文章: (1)轻松搞定项目中的空指针异常Caused by: java.l ...

  4. java.lang.NullPointerException: null无堆栈信息

    今天遇到个java.lang.NullPointerException: null,发现没有堆栈信息,无法定位.看了下代码,按道理是会打印堆栈的啊. try {... } catch(Throwabl ...

  5. java.lang.NullPointerException: null的错误

    在调试后台程序时,出现了java.lang.NullPointerException: null的问题,控制台打印的日志如下: 2022-02-14 06:55:21.313 ERROR 11600 ...

  6. Null value appeared in non-nullable field java.lang.NullPointerException

    报错 Null value appeared in non-nullable field java.lang.NullPointerException: Null value appeared in ...

  7. spark报错 java.lang.NullPointerException: Null value appeared in non-nullable field:top level Product

    报错内容 java.lang.NullPointerException: Null value appeared in non-nullable field: top level Product in ...

  8. 自己写的将数组中的“null“字符串转成null的小工具类,报java.lang.NullPointerException

    起初的工具类代码: //转字符"null"为空public static void toNull(Object[] obj){if (obj!=null) {for (int i ...

  9. 空指针在java中的环境配置,轻松搞定项目中的空指针异常Caused by: java.lang.NullPointerException: null...

    大家在项目测试过程中,是不是经常会碰到这个空指针异常呢Caused by: java.lang.NullPointerException: null 当大家遇到这个问题,大家是怎么处理?自己解决还是让 ...

最新文章

  1. C++11中std::shared_future的使用
  2. 03-MySQL多表操作
  3. Linux概念架构的理解
  4. mount windows目录
  5. c iostream.源码_通达信《牛气冲天》指标,共振主升浪冲涨停,牛散经常用(附源码...
  6. 汇编语言(二十八)之统计单词
  7. MT7628如何控制GPIO
  8. vs2013代码模板设置
  9. postman常用断言
  10. 复合函数求导经典例题_【2017年整理】多元函数求导经典例题.ppt
  11. Python:NBA球员得分数据排行爬虫
  12. 排查内存orJVM内存飙高
  13. bsc链发行代币遇到了问题
  14. 【算法】算法学习网站
  15. mysql 下一年_mysql时间增加一年
  16. 年仅22岁的苹果视障工程师正在改变科技世界
  17. SpringBoot整合微信支付开发在线教育视频网站(完整版)
  18. 10 种创新的智慧废弃物管理技术
  19. BATJ都爱问的Java多线程面试题整理
  20. DC 视频教程 第八期

热门文章

  1. Executors-四种创建线程的手段
  2. 楼教主的ACM心路历程
  3. 软件工程c语言2000行代码,C语言教务管理系统(2000行代码)
  4. “百度杯”CTF比赛 十一月场 - 敲击
  5. Linux bash 数组 for循环遍历
  6. ae输出quicktime设置_详解AE输出设置及解析原因
  7. 【钉钉-场景化能力包】企业做培训直播
  8. CAD二次开发——填充
  9. 用vscode编写matlab
  10. Linux ping命令,检测网络是否连通