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
    }
}
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
}
只需查看主要方法,您就可以看到感兴趣的行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));
}
并将String.valueOf()使用nulls 执行此操作:
public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}
所以你可以看到有一个测试处理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())
o.toString()尝试取消引用null对象以将其转换为字符串,然后再将其传递给println.
System.out.print(o1);
在print被称为是print(Object)变种,它本身就是检查的对象不是继续之前空.