运维开发网

详细介绍Java中异常产生的原因,详细介绍解决方法

运维开发网 https://www.qedev.com 2022-05-31 15:42 出处:网络
这篇文章主要介绍了详解Java中NullPointerException异常的原因详解以及解决方法。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编

这篇文章主要介绍了详解Java中NullPointerException异常的原因详解以及解决方法。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编

NullPointerException是当您尝试使用指向内存中空位置的引用(null)时发生的异常,就好像它引用一个对象一样。

当我们声明一个引用变量(即一个对象)时,我们实际上是在创建一个指向该对象的指针。考虑下面的代码,您可以在其中声明基本类型的整数变量x:

int x;x = 10;

在这个例子中,变量x是一个整型变量,Java会为你将其初始化为0。当你在第二行把它赋值为10时,10的值将被写入x指向的内存。

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

Integer num;num = new Integer(10);

第一行声明了一个名为num的变量,但它不包含原始值。相反,它包含一个指针(因为类型Integer是一个引用类型)。由于你没有说任何关于指向Java的内容,所以它将其设置为null,这意味着“我没有指向任何东西”。

在第二行中,new关键字用于实例化(或创建)一个Integer类型的对象,并将该对象赋给指针变量num。现在您可以使用解引用操作符了。(点)来指代对象。

当您声明变量但不创建对象时,将会发生异常。如果您试图在创建num对象之前取消对它的引用,将会得到一个NullPointerException。在最琐碎的情况下,编译器会捕捉到问题,让你知道“num可能还没有初始化”,但有时候你写的代码不会直接创建对象。

例如,您可能使用了以下方法:

public void doSomething(SomeObject obj) { //do something to obj}

在这种情况下,不是创建对象obj,而是假设它是在调用方法之前创建的。如果您像这样调用该方法:

doSomething(null);

在这种情况下,obj为null。如果这个方法打算对传入的对象执行一些操作,它需要抛出一个异常,因为NullPointerException是一个程序错误,程序员将需要这些信息用于调试目的。

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

我该怎么解决?

所以你有一个NullPointerException。应该如何解决?让我们举一个简单的例子,它抛出NullPointerException:

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(); }}

标识空值

第一步是准确确定导致异常的值。为此,我们需要进行一些调试。学习堆栈跟踪很重要。这将显示引发异常的位置:

线程" main " Java . lang . nullpointerexception
at printer . print string(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是空。

跟踪这些值应该设置在哪里。

这是哪里. name set?在setName(String)方法中。通过更多的调试,我们可以看到这个方法根本没有被调用。如果调用此方法,请确保检查这些方法的调用顺序,并且不要在print方法之后调用set方法。

这足以为我们提供一个解决方案:在调用printer.setName()之前,添加一个对printer.print()的调用。

其他修订

变量可以有一个默认值(setName可以防止它被设置为null):

private String name = "";

任何print或printString方法都可以检查空,例如:

printString((name == null) #63; "" : name);

或者,您可以设计一个这样的类,以便null总是有一个非null值:

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中NullPointeException的原因和解决方法的详细解释,本文到此为止。关于Java NullPointerException的更多信息

0

精彩评论

暂无评论...
验证码 换一张
取 消