System.out.println(o);
null 有类型吗?null 是一个值还是一个对象?
我们知道若instanceof
左边为null
,那么不论右边是什么类,直接返回 false;至少可以知道 null 不是对象;其实执行valueOf(char[] data)
方法也证明了这点。
null 有类型吗?null 是一个值还是一个对象?
我们知道若instanceof
左边为null
,那么不论右边是什么类,直接返回 false;至少可以知道 null 不是对象;其实执行valueOf(char[] data)
方法也证明了这点。
1 System.out.println(String.valueOf((Integer)null));
null 造成的NullPointerException
大概是最常见的异常,不论是 JDK 还是第三方类库都做了很多工作尽可能的避免空指针异常;比如 Apache Commons 的 collections、lang 判空,Guava 的 Optional 等;甚至 Optional 类已经成为 Java 8 类库的一部分。
或许,大家认为这两段代码都会抛出空指针异常;其实,第二段代码会正常执行。
hah() 方法是上面例子中定义的方法,它用 static 修饰是静态方法;对于静态方法和静态变量,使用了静态绑定,并不会抛出空指针异常;但是像这种对象访问类成员的写法最好不要使用,很容易造成误解。
1 String s = null;
2 System.out.println(s.length());
1 Demo demo = null;
2 demo.hah("hello");
静态绑定就是在程序执行前方法已经被绑定(在编译期中已经确定);比如 demo.hah("hello") 这个代码,反编译 class 文件得到:
1 Demo demo = null;
2 hah((Object)"hello");
你会发现编译后方法调用已经和 demo 没有关系,必然不会抛出空指针异常。