具体题目记不清楚了,题目问的是将一个空引用转换为本类引用然后调用方法,判断执行结果。
个人感觉这其实跟c/c++的空指针相似
直接上测试代码
public class Main {
public static void main(String[] args) {
try {
((Main) null).teststaticNull();
} catch (NullPointerException e) {
System.out.println("null can not invoke static methood");
}
try {
((Main) null).testnormalNull();
} catch (NullPointerException e) {
System.out.println("null can not invoke normal methood");
}
}
private static void teststaticNull() {
System.out.println("null can invoke static methood");
}
private void testnormalNull() {
System.out.println("null can invoke normal methood");
}
}
输出结果
null can invoke static methood
null can not invoke normal methood
打开.class文件可以看到代码变成了
public static void main(String[] args) {
try {
Main var10000 = (Main)null;
teststaticNull();
} catch (NullPointerException var3) {
System.out.println("null can not invoke static methood");
}
try {
((Main)null).testnormalNull();
} catch (NullPointerException var2) {
System.out.println("null can not invoke normal methood");
}
}
道理很简单,static方法属于类,null调用static方法实际上是并不需要经过对象,相当于直接调用静态方法。所以第一个输出是这样的。
而实例方法是属于对象的。null在堆中并没有内存,并没有方法,Jvm通过反射invoke method时找不到就出现了我们看到的空引用异常。
补充
在Java Spec里面对null的说明如下:
There is also a special null type, the type of the expression null, which has no name. Because the null type has no name, it is impossible to declare a variable of the null type or to cast to the null type. The null reference is the only possible value of an expression of null type.The null reference can always be assigned or cast to any reference type. In practice, the programmer can ignore the null type and just pretend that null is merely a special literal that can be of any reference type.
有一个特殊的null类型,他没有名字,所以不能声明null类型变量,也不能成为被转换的对象。一个null类型表达式的唯一可能值就是空引用。null引用可以被任何引用类型赋值或者转换为任何引用类型。
最佳实践:程序员可以忽略null类型,把他当成可以是任何引用类型的字面量即可。
Java Spec 2.4. Reference Types and Values
null标识一个不指向任何对象的引用,空引用没有运行时类型,但是能被转换为任意引用类型,引用类型的默认值就是null。
Java Spec没有规定如何对null编码。
参考:http://www.voidcn.com/article/p-xkyelgxd-bsh.html
注意:不要将null赋值给基本类型,同时注意null的包装类自动拆箱给基本类型会产生空指针异常。
处理空指针异常
一般方式
if(object != null){
//doSomething();
}else{
//doOtherthing();
}
虽然看起来并不怎么舒服,但是也是可以处理的。一层还算好,要是几层下来的话,代码可读性就相当差了
http://stackoverflow.com/questions/271526/avoiding-null-statements里面几种处理方式可以一试
1.Assert
2.try/catch
3.使用注解@NotNull
Java8的Optional
总结:其实想想都会觉得简单,也就是类方法与实例方法的区别而已,只是在笔试中心态不够好。
不论是笔试还是面试,一个自信的心态极其重要,又想起了昨天面试一道翻转链表没写出来的事了。 首先自信的心态能够保证我们的发挥不失常,再者企业同样希望自信的人才。心态很重要。