java.lang.NullPointerException
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()。