- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这个问题的答案是 community effort .编辑现有答案以改进这篇文章。它目前不接受新的答案或交互。
什么是空指针异常 ( java.lang.NullPointerException
) 以及导致它们的原因?
可以使用哪些方法/工具来确定原因,以便阻止异常导致程序过早终止?
最佳答案
当你声明一个引用变量(即一个对象)时,你实际上是在创建一个指向一个对象的指针。考虑以下代码,其中声明了一个原始类型的变量 int
:
int x;
x = 10;
在本例中,变量
x
是
int
Java 会将其初始化为
0
为你。当您分配
10
的值时在第二行,您的值
10
被写入
x
所指的内存位置.
Integer num;
num = new Integer(10);
第一行声明了一个名为
num
的变量。 ,但它实际上并不包含原始值。相反,它包含一个指针(因为类型是
Integer
,它是一个引用类型)。由于您还没有说要指向什么,Java 将其设置为
null
,这意味着“
我没有指向任何东西 ”。
new
关键字用于实例化(或创建)
Integer
类型的对象, 和指针变量
num
分配给
Integer
目的。
NullPointerException
(NPE)发生在您声明一个变量但没有创建对象并将其分配给变量之前尝试使用变量的内容(称为取消引用)。所以你指向的东西实际上并不存在。
.
时通常会发生取消引用。访问方法或字段,或使用
[
索引一个数组。
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
是合适的。因为这是程序员的错误,程序员将需要该信息进行调试。
NullPointerException
s 作为方法逻辑的结果抛出,您还可以检查
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
被重新分配,它不为空并且可以安全地取消引用。
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
}
}
最后,
How to pinpoint the exception & cause using Stack Trace
What methods/tools can be used to determine the cause so that you stopthe exception from causing the program to terminate prematurely?
in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.List.size()" because "list" is null
关于java - 什么是 NullPointerException,我该如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42003774/
@Cacheable在同一类中方法调用无效 上述图片中,同一个类中genLiveBullets()方法调用同类中的queryLiveByRoom()方法,这样即便标识了Cacheable标签,
目录 @Transaction注解导致动态切换更改数据库失效 使用场景 遇到问题 解决 @Transaction
@RequestBody不能class类型匹配 在首次第一次尝试使用@RequestBody注解 开始加载字符串使用post提交(貌似只能post),加Json数据格式传输的时候,
目录 @Autowired注入static接口问题 @Autowired自动注入普通service很方便 但是如果注入static修饰的serv
目录 @RequestBody部分属性丢失 问题描述 JavaBean实现 Controller实现
目录 解决@PathVariable参数接收不完整的问题 今天遇到的问题是: 解决办法: @PathVariable接受的参
这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚。后来终于找到了原因。 如果你也出现了这种情况,可以从下面开始排查。 1、特性 先来了解一下@Trans
概述: ? 1
场景: 在处理定时任务时,由于这几个方法都是静态方法,在aop的切面中使用@Around注解,进行监控方法调用是否有异常。 发现aop没有生效。 代码如下:
最近做项目的时候 用户提出要上传大图片 一张图片有可能十几兆 本来用的第三方的上传控件 有限制图片上传大小的设置 以前设置的是2M&nb
我已经实现了这个SCIM reference code在我们的应用程序中。 我实现的代码确实通过了此postman link中存在的所有用户测试集合。 。我的 SCIM Api 也被 Azure 接受
我一直对“然后”不被等待的行为感到困扰,我明白其原因。然而,我仍然需要绕过它。这是我的用例。 doWork(family) { return doWork1(family)
我正在尝试查找 channel 中的消息是否仍然存在,但是,我不确定如何解决 promise ,查看其他答案和文档,我可以看到它可能是通过函数实现的,但我是不完全确定如何去做。我希望能在这方面获得一些
我有以下情况: 同一工作区中的 2 个 Eclipse 项目:Apa 和 Bepa(为简洁起见,使用化名)。 Apa 项目引用(包括)Bepa 项目。 我在 Bepa 有一个类 X,具有公共(publ
这个问题已经有答案了: Why am I getting a NoClassDefFoundError in Java? (31 个回答) 已关闭 6 年前。 我正在努力学习 spring。所以我输入
我正在写一个小游戏,屏幕上有许多圆圈在移动。 我在两个线程中管理圈子,如下所示: public void run() { int stepCount = 0; int dx;
我在使用 Sympy 求解方程时遇到问题。当我运行代码时,例如: 打印(校正(10)) 我希望它打印一个数字 f。相反,它给我错误:执行中止。 def correction(r): from
好吧,我制作的每个页面都有这个问题。我不确定我做错了什么,但我所有的页面都不适用于所有分辨率。可能是因为我使用的是宽屏?大声笑我不确定,但在小于宽屏分辨率的情况下,它永远不会看起来正确。它的某些部分你
我正在尝试像这样进行一个非常简单的文化 srting 检查 if(culture.ToUpper() == "ES-ES" || "IT-IT") { //do something } else
Closed. This question is off-topic. It is not currently accepting answers. Learn more。 想改进这个问题吗?Upda
我是一名优秀的程序员,十分优秀!