本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接
问题:在Java中为什么将Integer与int进行比较会抛出NullPointerException?
看到出现这种情况,让我很困惑:
Integer i = null;
String str = null;
if (i == null) { //Nothing happens
...
}
if (str == null) { //Nothing happens
}
if (i == 0) { //NullPointerException
...
}
if (str == "0") { //Nothing happens
...
}
所以,我认为装箱操作是首先执行(即java试图从null中提取int值)并且比较操作具有较低的优先级,这就是为什么抛出异常。
问题就是:为什么它在Java中以这种方式实现?为什么装箱操作比引用的比较操作有更高的优先级?或者说为什么它们没有在装箱前实现对null的验证?
但是目前来看,它看起来是和上面不一致的,因为它是在进行装箱的时候抛出NullPointerException而不是使用真正的对象类型时抛出。
回答一
Java的作者定义了==操作符来直接作用于不同类型的操作数,在这种情况下给定 Integer I; int i;比较I==i;有人就会问这样的问题:“我持有一个的Integer类型引用的值是i吗?”——这个问题毫无难度即使 I是null。不幸的是,Java不会直接检查不同类型的操作数是否相等;相反,它检查Java语言是否允许将任意一个操作数的类型转换为另一个操作数的类型,如果允许,则将转换后的操作数与未转换的操作数进行比较。这种行为意味着对于变量x, y和z的一些类型组合,可以有x==y和y==z,但是x!= z(如。x = 16777216f y = 16777216 z = 16777216]。这也意味着比较I== i被翻译为“将I转换为int,如果不抛出异常,就将其与i比较。
文章翻译自Stack Overflow:stackoverflow.com/questions/3…