- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解Java中NullPointerException异常的原因详解以及解决方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
NullPointerException是当您尝试使用指向内存中空位置的引用(null)时发生的异常,就好像它引用了一个对象一样.
当我们声明引用变量(即对象)时,实际上是在创建指向对象的指针。考虑以下代码,您可以在其中声明基本类型的整型变量x:
1
2
|
int
x;
x =
10
;
|
在此示例中,变量x是一个整型变量,Java将为您初始化为0。当您在第二行中将其分配给10时,值10将被写入x指向的内存中.
但是,当您尝试声明引用类型时会发生不同的事情。请使用以下代码:
1
2
|
Integer num;
num =
new
Integer(
10
);
|
第一行声明了一个名为的变量num,但它不包含原始值。相反,它包含一个指针(因为类型Integer是一个引用类型)。既然你还没有说什么指向Java,它将它设置为null,意思是“ 我什么都没有指向”.
在第二行中,new关键字用于实例化(或创建)Integer类型的对象,并为指针变量num分配此对象。您现在可以使用解引用运算符.(点)来引用对象.
在当你声明了一个变量,但是没有创建一个对象,会发生Exception。如果您在创建num对象之前尝试取消引用,则会得到一个NullPointerException。在最琐碎的情况下,编译器将捕获问题并让您知道“num可能尚未初始化”,但有时您编写的代码不会直接创建对象.
例如,您可能使用了如下的方法:
1
2
3
|
public
void
doSomething(SomeObject obj) {
//do something to obj
}
|
在这种情况下,您没有创建对象obj,而是假设它是在doSomething调用方法之前创建的。如果你像这样调用方法:
1
|
doSomething(
null
);
|
在这种情况下obj为null。如果该方法旨在对传入的对象执行某些操作,则需要抛出异常,因为NullPointerException它是程序错误,程序员将需要该信息用于调试的目的.
或者,可能存在这样的情况:该方法的目的不仅仅是对传入的对象进行操作,因此可以接受空参数。在这种情况下,您需要检查null参数并采取不同的行为。您还应该在文档中解释这一点。例如,doSomething应该最好写成:
1
2
3
4
5
6
7
8
9
10
11
|
/**
* @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
}
}
|
我如何解决它?
所以你有一个NullPointerException。应该如何解决?让我们举一个简单的例子,它抛出NullPointerException:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public
class
Printer {
private
String name;
public
void
setName(String name) {
this
.name = name;
}
public
void
print() {
printString(name);
}
private
void
printString(String s) {
System.out.println(s +
" ("
+ s.length() +
")"
);
}
public
static
void
main(String[] args) {
Printer printer =
new
Printer();
printer.print();
}
}
|
标识空值 。
第一步是确切地确定导致异常的值。为此,我们需要做一些调试。学习阅读堆栈跟踪很重要。这将显示抛出异常的位置:
Exception in thread "main" java.lang.NullPointerException at Printer.printString(Printer.java:13) at Printer.print(Printer.java:9) at Printer.main(Printer.java:19) 。
在这里,我们看到在第13行抛出异常(在printString方法中)。查看该行并通过添加日志记录语句或使用调试器来检查哪些值为空。我们发现它s是null,并且调用length方法会抛出异常。我们可以看到程序在s.length()方法中删除时停止抛出异常.
追踪这些值来自哪里 。
接下来检查此值的来源。按照该方法的调用者,我们可以看到,s与传递printString(name)的print()方法,并this.name为空.
跟踪应设置这些值的位置 。
在哪里this.name设置?在setName(String)方法中。通过一些更多的调试,我们可以看到根本没有调用此方法。如果调用该方法,请确保检查调用这些方法的顺序,并且在print方法之后不调用set 方法.
这足以为我们提供一个解决方案:在调用printer.setName()之前添加调用printer.print().
其他修正 。
该变量可以具有默认值(并且setName可以防止将其设置为null):
1
|
private
String name =
""
;
|
任一print或printString方法可以检查空,例如:
1
|
printString((name ==
null
) ?
""
: name);
|
或者您可以设计如下所示的类,以便name 始终具有非null值:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public
class
Printer {
private
final
String name;
public
Printer(String name) {
this
.name = Objects.requireNonNull(name);
}
public
void
print() {
printString(name);
}
private
void
printString(String s) {
System.out.println(s +
" ("
+ s.length() +
")"
);
}
public
static
void
main(String[] args) {
Printer printer =
new
Printer(
"123"
);
printer.print();
}
}
|
到此这篇关于详解Java中NullPointerException异常的原因详解以及解决方法的文章就介绍到这了,更多相关Java NullPointerException异常内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/Vermont_/article/details/84261442 。
最后此篇关于详解Java中NullPointerException异常的原因详解以及解决方法的文章就讲到这里了,如果你想了解更多关于详解Java中NullPointerException异常的原因详解以及解决方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我对cassandra并使用1.2.10非常陌生。我有一个时间戳数据类型的主键列。现在,我正在尝试检索日期范围的数据。由于我们知道不能在cassandra中使用,因此我使用的是大于()来获取日期范围。
我正在尝试进行有条件的转场。但我得到: Terminating app due to uncaught exception 'NSInvalidArgumentException', reas
我有一个游戏项目,在调试和发布模式下在设备上运行得非常好。我有两个版本。旧版本和新版本具有更多(后来我添加了)功能,并且两者的 bundle ID、版本相同。当我构建旧版本时,之前没有安装“myGam
这个问题已经有答案了: 奥 git _a (2 个回答) 已关闭 5 年前。 我正在获取 ClassCastException 。这两个类来自不同的 jar,但是JettyContinuationPr
以下代码行抛出异常: HttpResponse response = client.execute(request); // actual HTTP request 我能够捕获它并打印: Log
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
public class TwoThreads { private static Object resource = new Object(); private static void
当我输入 6 (int) 作为值时,运行此命令会出现段错误 (gcc filename.c -lm)。请帮助我解决这个问题。预期的功能尚未实现,但我需要知道为什么我已经陷入段错误。 谢谢! #incl
所以,过去一周半我一直在研究这个 .OBJ/.MTL 网格解析器。在这段时间里,我一直在追踪/修复很多错误、清理代码、记录代码等等。 问题是,每修复一个错误,仍然会出现这个问题,而且一张图片胜过一千个
我正在运行一个代码,它基本上围绕 3 个维度旋转一个大数据数组(5000 万行)。但是,我遇到了一个奇怪的问题,我已将其缩小到如何评估旋转矩阵。基本上,对于除绕 x 轴以外的任何旋转,python 代
就在你说这是重复之前,我已经看到了其他问题,但我仍然想发布这个。 所以我正在阅读 Thinking in Java -Bruce Eckel 这篇文章是关于小写命名约定的: In Java 1.0 a
我想在我的应用程序中使用 REST API。它为我从这个应用程序发出的所有请求抛出 SocketTimeoutException。 Logcat 输出:(您也可以在此处看到带有漂亮格式的输出:http
我知道 raise ... from None 并已阅读 How can I more easily suppress previous exceptions when I raise my own
在未能找到各种Unix工具(例如xargs和whatnot)的最新独立二进制文件(this version很好,但需要外部DLL)后,我承担了自己进行编译的挑战。 ...这是痛苦的。 最终,尽管如此,
我有一个用PHP编写的流套接字服务器。 为了查看一次可以处理多少个连接,我用C语言编写了一个模拟器来创建1000个不同的客户端以连接到服务器。 stream_socket_accept几次返回fals
我的Android Studio昨天运行良好,但是今天当我启动Android Studio并想在移动设备上运行应用程序时,发生了以下错误, 我在互联网和stackoverflow上进行了搜索,但没有解
默认情况下,grails似乎为Java域对象的toString()返回:。那当然不是我想要的,所以我尝试@Override toString()返回我想要的。当我尝试grails generate-a
尝试通过LDAP通过LDAP对用户进行身份验证时,出现以下错误。 Reason: Cannot pass null or empty values to constructor. 谁能告诉我做错了什么
我正在尝试使用应用程序附带的 Houdini Python 模块,该模块是 Houdini 安装文件夹的一部分,位于标准 Python 路径之外。按照安装说明操作后,运行 Houdini Termin
简单地说,我正在为基本数据库编写单链表的原始实现。当用户请求打印索引下列出的元素高于数据库中当前记录数量时,我不断出现段错误,但仅当差值为 1 时。对于更高的数字,它只会触发我在那里编写的错误系统。
我是一名优秀的程序员,十分优秀!