为什么int num = integer.getInteger(“ 123”)投掷nullpoInterException?
-
30-09-2019 - |
题
以下代码投掷 NullPointerException
:
int num = Integer.getInteger("123");
是我的编译器 getInteger
在零是静态的情况下?那没有任何意义!
发生了什么?
解决方案
大局
这里有两个问题:
Integer getInteger(String)
不做你认为做的事情- 它返回
null
在这种情况下
- 它返回
- 来自
Integer
到int
引起自动盒- 自从
Integer
是null
,NullPointerException
被扔了
- 自从
解析 (String) "123"
到 (int) 123
, ,您可以使用EG int Integer.parseInt(String)
.
参考
Integer
API参考
在 Integer.getInteger
以下是文档对此方法的说法:
public static Integer getInteger(String nm)
: :用指定名称确定系统属性的整数值。如果没有指定名称的属性,则指定的名称为空或null
, ,或者如果属性没有正确的数字格式,则null
退回。
换句话说,这种方法与解析无关 String
到一个 int/Integer
价值,而是与 System.getProperty
方法。
诚然,这可能是一个惊喜。不幸的是,图书馆有这样的惊喜,但是它确实会教您一个宝贵的教训:始终查找文档以确认方法的作用。
偶然地,此问题的变体在 难题的回归:Schlock和Awe(TS-5186), ,Josh Bloch和Neal Gafter的2009 Javaone技术会议演示文稿。这是总结幻灯片:
道德
- 奇怪而可怕的方法潜伏在图书馆中
- 有些有无害的名字
- 如果您的代码行为不端
- 确保您调用正确的方法
- 阅读库文档
- 适用于API设计师
- 不要违反至少惊讶的原则
- 不要违反抽象层次结构
- 不要使用类似的名称来实现截然不同的行为
为了完整,也有这些方法类似于 Integer.getInteger
:
相关问题
在自动箱上
当然,另一个问题是 NullPointerException
被扔了。为了关注这个问题,我们可以简化摘要如下:
Integer someInteger = null;
int num = someInteger; // throws NullPointerException!!!
这是有效Java第二版中的报价,项目49:更喜欢原始类型而不是盒装原语:
总而言之,只要有选择,就可以使用原始方法来选择盒装原始。原始类型更简单,更快。如果您必须使用盒装原语,请小心! Autoboxing降低了使用盒装原语的详细性,但没有危险。当您的程序将两个盒子的原语比较时
==
操作员,它进行身份比较,几乎可以肯定不是您想要的。当您的程序执行涉及盒装和未盒装原始图的混合型计算时,它会拆箱,并且当您的程序拆开时,它可以投掷NullPointerException
. 。最后,当您的程序框具有原始值时,它可能会导致昂贵且不必要的对象创建。
在某些地方,您别无选择,只能使用盒装原语,例如仿制药,但是否则,您应该认真考虑是否有合理的决定使用盒装原语。
相关问题
其他提示
从 http://konigsberg.blogspot.com/2008/04/integergetInteger-are-are-are-you-kidding-me.html:
GetInteger'用指定名称确定系统属性的整数值。”
你要这个:
Integer.parseInt("123")
请检查该方法的文档 getinteger()。在这种方法中, String
参数是一种系统属性,它用指定名称确定系统属性的整数值。 “ 123”不是任何系统属性的名称,如所讨论 这里。如果要将此字符串转换为 int
, ,然后将方法用作int num = Integer.parseInt("123")
.