java.lang.NullPointerException

时间:2020-02-23 14:36:40  来源:igfitidea点击:

java.lang.NullPointerException是Java编程中最流行的异常之一。
在Java中工作的任何人都必须在Java独立程序以及Java Web应用程序中无所不包。

java.lang.NullPointerException

NullPointerException是运行时异常,因此我们无需在程序中捕获它。
当我们尝试在需要对象的null上执行某些操作时,会在应用程序中引发NullPointerException。
Java程序中NullPointerException的一些常见原因是:

  • 在对象实例上调用方法,但在运行时该对象为null。

  • 在运行时访问为null的对象实例的变量。

  • 在程序中抛出null

  • 访问为空的数组的索引或者修改索引的值

  • 检查在运行时为null的数组的长度。

Java NullPointerException示例

让我们看一下Java程序中NullPointerException的一些示例。

  • 调用实例方法时发生NullPointerException
    当我们在上面的程序上运行时,它将引发以下NullPointerException错误消息。

我们在语句t.foo(" Hi");中得到NullPointerException,因为这里的" t"为空。

  • Java NullPointerException,同时访问/修改空对象的字段
    上面的程序将引发以下NullPointerException堆栈跟踪。

在语句" int i = t.x;"中引发了NullPointerException,因为此处的" t"为空。

  • 在方法参数中传递null时,Java NullPointerException
    这是java.lang.NullPointerException的最常见情况之一,因为它是传递null参数的调用方。
    下图显示了在Eclipse IDE中执行上述程序时的null指针异常。

  • 抛出null时,java.lang.NullPointerException
    下面是上面程序的异常堆栈跟踪,显示了由于throw null;语句引起的NullPointerException。

  • 获取空数组长度时的java.lang.NullPointerException

  • 访问null数组的索引值时发生NullPointerException

  • 在null对象上同步时java.lang.NullPointerException
    synchronized(mutex)将抛出NullPointerException,因为" mutex"对象为null。

  • HTTP状态500 java.lang.NullPointerException

有时,我们会以Java Web应用程序响应的形式发送错误页面,错误消息为" HTTP Status 500 – Internal Server Error",根本原因为" java.lang.NullPointerException"。

为此,我编辑了Spring MVC Example项目并更改了HomeController方法,如下所示。

public class Temp {

	public static void main(String[] args) {

		Temp t = initT();
		
		t.foo("Hi");
		
	}

	private static Temp initT() {
		return null;
	}

	public void foo(String s) {
		System.out.println(s.toLowerCase());
	}
}

下图显示了Web应用程序响应抛出的错误消息。

这是异常堆栈跟踪;

Exception in thread "main" java.lang.NullPointerException
	at Temp.main(Temp.java:7)

根本原因是语句user.getUserId()。
toLowerCase()中的NullPointerException,因为user.getUserId()返回的是null。

如何检测java.lang.NullPointerException

检测NullPointerException非常容易,只需查看异常跟踪,它就会为您显示异常的类名和行号。
然后查看代码,看看可能为null导致NullPointerException的情况。
只要看一下以上所有示例,就可以从堆栈跟踪中很清楚地了解是什么导致了空指针异常。

如何修复java.lang.NullPointerException

java.lang.NullPointerException是未经检查的异常,因此我们不必捕获它。
通常,可以使用空检查和预防性编码技术来防止空指针异常。
请看下面的代码示例,这些示例显示了如何避免java.lang.NullPointerException

public class Temp {

	public int x = 10;
	
	public static void main(String[] args) {

		Temp t = initT();
		
		int i = t.x;
		
	}

	private static Temp initT() {
		return null;
	}

}
Exception in thread "main" java.lang.NullPointerException
	at Temp.main(Temp.java:9)

编码最佳实践,以避免java.lang.NullPointerException

  • 考虑下面的代码示例。

现在,如果将参数作为null传递,则可以发生NullPointerException。
可以如下编写相同的方法来避免NullPointerException。

  • 如果需要,我们还可以为参数添加null检查,并抛出IllegalArgumentException

  • 如以下示例代码所示,使用三元运算符。

  • 使用String.valueOf()而不是toString()方法。
    例如,检查PrintStream println()方法的代码定义如下。

因此,下面显示了使用valueOf()方法代替toString()的示例。

  • 编写返回空对象而不是null的方法,例如空列表,空字符串等。

  • 集合类中定义了一些方法来避免NullPointerException,请使用它们。
    例如contains(),containsKey()和containsValue()。