Ank*_*wal 13 java nullpointerexception
在println中,这里o.toString()抛出NPE但是o1抛出NPE.为什么?
public class RefTest {
public static void main(String[] args) {
Object o = null;
Object o1 = null;
System.out.println(o.toString()); //throws NPE
System.out.print(o1); // does not throw NPE
}
}
Run Code Online (Sandbox Code Playgroud)
Pau*_*ime 27
它可能有助于向您显示字节码.看一下javap你班级的以下输出:
> javap -classpath target\test-classes -c RefTest
Compiled from "RefTest.java"
public class RefTest extends java.lang.Object{
public RefTest();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: aconst_null
1: astore_1
2: aconst_null
3: astore_2
4: getstatic #17; //Field java/lang/System.out:Ljava/io/PrintStream;
7: aload_1
8: invokevirtual #23; //Method java/lang/Object.toString:()Ljava/lang/String;
11: invokevirtual #27; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
14: getstatic #17; //Field java/lang/System.out:Ljava/io/PrintStream;
17: aload_2
18: invokevirtual #33; //Method java/io/PrintStream.print:(Ljava/lang/Object;)V
21: return
}
Run Code Online (Sandbox Code Playgroud)
只需查看主要方法,您就可以看到感兴趣的行Code是8和33.
代码8显示了您调用的字节码o.toString().这o是null因为任何对方法调用的尝试都会null导致a NullPointerException.
代码18显示您的null对象作为参数传递给PrintStream.print()方法.看着这个方法会告诉你为什么这样做的源代码不会在NPE导致:
public void print(Object obj) {
write(String.valueOf(obj));
}
Run Code Online (Sandbox Code Playgroud)
并将String.valueOf()使用nulls 执行此操作:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
Run Code Online (Sandbox Code Playgroud)
所以你可以看到有一个测试处理null,并阻止NPE.
这是因为转换的print(Object)用途String.valueOf(Object)(除了:在转换之后println(Object)表现得好像print(String)被调用,print(Object)有效地使用write(int)).String.valueOf(Object)不像是那样抛出NPE o.toString()而是定义为返回"null"null参数.
System.out.println(o.toString())
Run Code Online (Sandbox Code Playgroud)
o.toString()尝试取消引用null对象以将其转换为字符串,然后再将其传递给println.
System.out.print(o1);
Run Code Online (Sandbox Code Playgroud)
在print被称为是print(Object)变种,它本身就是检查的对象不是继续之前空.