java类型中的坑

来源:互联网 发布:山西教师网络研修网 编辑:程序博客网 时间:2024/06/05 19:42

最近在跟开发一起做代码review的时候,发现一个很有意思的nullpointexception。

我们先来看这么一段代码

return  1==testcase.testStatus:true?false;

初看没什么不对是不是,但是这有个问题

在java里边,1是值类型,而testStatus是一个引用类型

这里稍微扩展下:
值类型:也就是基本数据类型,包括
四类:1,整型、2,浮点型、3,字符型、4,逻辑型。
八种:1,整型有三种:byte , short,int ,long
2,浮点型有二种:float,double
3,字符型有一种:char
4,逻辑型有一种:boolean
引用类型就是除了这些以外的其他类型

所以看到这里,应该懂了.虽然testStatus本身是一个integer。这么直接比较理论上是可以的。
但是如果,teststatus被置成空,引用的类型要跟值类型进行比较,就会进行拆箱,拆箱的时候
如果指针指向是空的,就会引发nullpointexception,导致服务不可用。

装箱和拆箱就是值类型和引用类型的转化的过程。
将一个值类型转换成引用类型的称为装箱。
讲一个引用类型的转换成值类型的称为拆箱。
值类型变量装箱成为一个引用类型的变量时,首先会在托管上为新的引用类型变量分配内存空间,然后将值类型变量拷贝到托管堆上新分配的对象内存中,最后返回新分配的对象内存地址。
装箱操作是可逆的,所有就有了拆箱的操作,拆箱操作获取指向对象中包含值类型部分的指针,然后由程序员手动将其对应的值拷贝给值类型变量。

上述的错误,会导致空指针,方法失效。

针对这延伸一下,有哪些写代码的方式会容易引起空指针异常,在代码review中要注意识别的
http://www.importnew.com/7268.html

发现还是有很多的。只能说,开发要想做的好也是不容易啊。