Java 为什么int num=Integer.getInteger(“123”)抛出NullPointerException?
下面的代码抛出Java 为什么int num=Integer.getInteger(“123”)抛出NullPointerException?,java,integer,nullpointerexception,api-design,autoboxing,Java,Integer,Nullpointerexception,Api Design,Autoboxing,下面的代码抛出NullPointerException: int num = Integer.getInteger("123"); 由于是静态的,我的编译器是否在null上调用getInteger?那没有任何意义 发生了什么事?大局 这里有两个问题: Integer-getInteger(String)不会做您认为它会做的事情 在这种情况下,它返回null 从Integer到int的赋值会导致自动取消装箱 由于整数是null,因此会抛出NullPointerException 要将
NullPointerException
:
int num = Integer.getInteger("123");
由于是静态的,我的编译器是否在null上调用getInteger
?那没有任何意义
发生了什么事?大局
这里有两个问题:
不会做您认为它会做的事情Integer-getInteger(String)
- 在这种情况下,它返回
null
- 在这种情况下,它返回
- 从
到Integer
的赋值会导致自动取消装箱int
- 由于
是整数
,因此会抛出null
NullPointerException
- 由于
(字符串)“123”
解析为(int)123
,可以使用例如int Integer.parseInt(字符串)
工具书类
Integer
API引用
在
Integer.getInteger上
以下是文档中关于此方法的作用的说明:
:确定具有指定名称的系统属性的整数值。如果没有具有指定名称的属性,如果指定名称为空或null
,或者属性没有正确的数字格式,则返回null
换句话说,此方法与将字符串
解析为int/Integer
值无关,而是与方法有关
诚然,这可能会让人大吃一惊。不幸的是,库中有这样的惊喜,但它确实给了您一个宝贵的教训:总是查阅文档以确认方法的作用
同时,Josh Bloch和Neal Gafter在2009年JavaOne技术会议上的演讲中也提到了这个问题的一个变体。下面是结束幻灯片:
道德
- 图书馆里潜伏着奇怪而可怕的方法
- 有些名字听起来无害
- 如果您的代码出现错误
- 确保调用了正确的方法
- 阅读图书馆文档
- 适用于API设计人员
- 不要违背最小惊奇原则
- 不要违反抽象层次结构
- 不要对完全不同的行为使用相似的名称
为完整起见,还有类似于Integer.getInteger
的以下方法:
相关问题
关于自动拆箱
当然,另一个问题是如何抛出NullPointerException
。为了关注这个问题,我们可以将代码片段简化如下:
Integer someInteger = null;
int num = someInteger; // throws NullPointerException!!!
这里引用了《有效Java第二版》第49项:与盒装原语相比,更喜欢原语类型:
总之,只要有选择,就优先使用基本体而不是盒装基本体。基本类型更简单、更快。如果必须使用盒装原语,请小心!自动装箱减少了使用装箱原语的冗长性,但不会减少危险性。当您的程序使用=
操作符比较两个装箱原语时,它会进行标识比较,这几乎肯定不是您想要的。当您的程序执行包含已装箱和未装箱原语的混合类型计算时,它会执行取消装箱,当您的程序执行取消装箱时,它会抛出NullPointerException
。最后,当您的程序装箱原语值时,可能会导致昂贵和不必要的对象创建
有些地方你除了使用泛型的原语(例如泛型)别无选择,但如果你决定使用装箱原语,那么你应该认真考虑。< /P>
相关问题
- (是的!!!)
- (不!!!)
- (是的,很不幸)
来自:
getInteger'确定具有指定名称的系统属性的整数值。'
你想要这个:
Integer.parseInt("123")
请检查该方法的文档。
在此方法中,字符串
参数是一个系统属性,用于确定具有指定名称的系统属性的整数值。如前所述,“123”不是任何系统属性的名称。
如果要将此字符串转换为int
,请使用以下方法:
int num=Integer.parseInt(“123”)
因此Integer.getInteger
大致等同于Integer.parseInt(System.getProperty))
?我想我更喜欢第二个,尽管它更详细,因为它突出了一个事实,即您正在从系统属性中提取信息。当我发布该评论时,我意识到我可以只查看Integer类的实际源!我的思路是正确的,只是它使用了Integer.decode
而不是Integer.parseInt
,后者查找前导的0x
或0
将数字解析为十六进制或八进制,分别。对于那些询问为什么NullPointerException
?:@Oracle您可以不推荐java.lang.Integer.getInteger(字符串)吗?请改用Integer.getValue()。这篇博文很好地解释了为什么: