在Java中,我可以执行以下操作来简洁地防范NullPointerException
:
if ("myString".equals(someOtherString))
Run Code Online (Sandbox Code Playgroud)
但我不能对整数做同样的事,例如
if (5.equals(someOtherInteger))
Run Code Online (Sandbox Code Playgroud)
我收到编译时错误.有关为何做出此设计决定的任何想法?或者任何可能解释它的资源?提前致谢.
编辑:someOtherInteger
是一个Integer
,而不是一个int
.
tru*_*ity 13
String
一直是Java中的一个对象.字符串没有自动装箱,原则上不存在.最近已经引入int
了从原语到Integer
对象的自动装箱.
有问题的是,为什么尝试访问基元的成员变量不会调用自动装箱(95.toString(radix)
实际上会非常方便),但我想原因是它不被认为是一个可能的用例,因为几乎每个wrappedPrimitive.method()
都有一个等价的WrapperClass.method( primitive )
版本.
equals()
原始类型通常是不必要的,因为==
已经存在.但是,你确实为它做了一个很好的例子,作为一个空值保护... 5 == integerInstance
将尝试取消装箱实例,并且不幸的NullPointerException
是null
,如果实例是,则抛出一个.(起初我并不完全理解你的观点.)
也就是说,如果我们能够从当前正在研究Java的人那里听到或者在引入自动装箱时听到他们是否考虑过这种功能,那将会非常酷.
Jef*_*rey 10
该JLS指定装箱转换可以在分配的转换,方法调用转换或铸造的转换才会发生.由于既没有5
为变量赋值,也没有将其作为参数传递给方法,也没有明确地将其转换为变量Integer
,因此不会为您自动进行自动装箱.
赋值转换(第5.2节,第15.26节)将表达式的类型转换为指定变量的类型.
赋值转换可能导致OutOfMemoryError(由于装箱转换(第5.1.7节)),NullPointerException(由于取消装箱转换(第5.1.8节))或ClassCastException(由于未经检查的转换( §5.1.9))在运行时抛出.
方法调用转换(第5.3节,第15.9节,第15.12节)应用于方法或构造函数调用中的每个参数,并且除了一种情况外,执行与赋值转换相同的转换.
方法调用转换可能导致OutOfMemoryError(作为装箱转换(第5.1.7节)的结果),NullPointerException(作为拆箱转换(第5.1.8节)的结果)或ClassCastException(作为未经检查的转换的结果) (§5.1.9))在运行时抛出.
转换上下文允许使用以下之一:
...
一个拳击转换(第5.1.7节),可选地后跟一个加宽的引用转换(第5.1.5节)
归档时间: |
|
查看次数: |
2263 次 |
最近记录: |