本文主要介绍Java中NullPointerException异常产生的原因及解决方法的详细说明。本文中的示例代码非常详细,对于大家的学习或者工作都有一定的参考价值。让我们和边肖一起学习。
NullPointerException是当您试图使用指向内存中的空位置的引用(null)时发生的异常,就像它引用一个对象一样。
当我们声明一个引用变量(即一个对象)时,我们实际上是在创建一个指向该对象的指针。考虑下面的代码,您可以在其中声明基本类型的整数变量x:
int x;
x=10
在这个例子中,变量x是一个整型变量,Java会为你将其初始化为0。当你在第二行把它赋值为10时,10的值将被写入x指向的内存。
但是,当您尝试声明引用类型时,会发生不同的事情。请使用以下代码:
整数num
num=新整数(10);
第一行声明了一个名为num的变量,但它不包含原始值。相反,它包含一个指针(因为类型Integer是一个引用类型)。由于你没有说任何关于指向Java的内容,所以它将其设置为null,这意味着“我没有指向任何东西”。
在第二行中,new关键字用于实例化(或创建)一个Integer类型的对象,并将该对象赋给指针变量num。现在您可以使用解引用操作符了。(点)来指代对象。
当您声明变量但不创建对象时,将会发生异常。如果您试图在创建num对象之前取消对它的引用,将会得到一个NullPointerException。在最琐碎的情况下,编译器会捕捉到问题,让你知道“num可能还没有初始化”,但有时候你写的代码不会直接创建对象。
例如,您可能使用了以下方法:
public void do something(SomeObject obj){
//对obj做些什么
}
在这种情况下,不是创建对象obj,而是假设它是在调用方法之前创建的。如果您像这样调用该方法:
do something(null);
在这种情况下,obj为null。如果这个方法打算对传入的对象执行一些操作,它需要抛出一个异常,因为NullPointerException是一个程序错误,程序员将需要这些信息用于调试目的。
或者,在某些情况下,该方法的目的不仅仅是对传入对象进行操作,因此它可以接受空参数。在这种情况下,您需要检查null参数并采取不同的操作。您还应该在文档中解释这一点。例如,doSomething最好写成:
/**
* @ param obj _ _ _ _ _的可选foo。可能为空,在这种情况下
*结果将是____。
*/
public void do something(SomeObject obj){
if(obj!=null) {
//做点什么
}否则{
//做点别的
}
}
我如何解决它?
所以你有一个NullPointerException。应该如何解决?让我们举一个简单的例子,它抛出NullPointerException:
公共类打印机{
私有字符串名称;
public void setName(字符串名){
this.name=name
}
公共作废打印(){
printString(名称);
}
私有void printString(String s) {
system . out . println(s '(' s . length()')');
}
公共静态void main(String[] args) {
Printer printer=新打印机();
printer . print();
}
}
标识空值
第一步是准确确定导致异常的值。为此,我们需要进行一些调试。学习堆栈跟踪很重要。这将显示引发异常的位置:
线程“main”Java . lang . nullpointerexception中出现异常
at printer . printstring(printer . Java:13)
at Printer.print(Printer.java:9)
位于Printer.main(Printer.java:19)
这里,我们看到第13行抛出了异常(在printString方法中)。查看该行,并通过添加日志记录语句或使用调试器来检查哪些值为空。我们发现它的s为null,调用length方法抛出异常。我们可以看到程序在s.length()方法中删除时停止抛出异常。
追踪这些值来自哪里
接下来,检查这个值的来源。根据这个方法的调用者,我们可以看到s和传递printString(name)的print()方法都是空的。
跟踪应设置这些值的位置
这是哪里. name set?在setName(String)方法中。通过更多的调试,我们可以看到这个方法根本没有被调用。如果调用此方法,请确保检查这些方法的调用顺序,并且不要在print方法之后调用set方法。
这足以为我们提供一个解决方案:在调用printer.setName()之前,添加一个对printer.print()的调用。
其他修正
变量可以有一个默认值(setName可以防止它被设置为null):
私有字符串名称=“”;
任何print或printString方法都可以检查空值,例如:
printString((name==null)?‘:名称);
或者,您可以设计一个这样的类,以便null总是有一个非null值:
公共类打印机{
私有最终字符串名称;
公共打印机(字符串名){
this . name=objects . require nonnull(name);
}
公共作废打印(){
printString(名称);
}
私有void printString(String s) {
system . out . println(s '(' s . length()')');
}
公共静态void main(String[] args) {
Printer打印机=新打印机(' 123 ');
printer . print();
}
}
关于Java中NullPointeException的原因和解决方法的详细解释,本文到此为止。有关Java NullPointerException的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。