,,详解Java中NullPointerException异常的原因详解以及解决方法

,,详解Java中NullPointerException异常的原因详解以及解决方法

本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: