以下代码投掷 NullPointerException:

int num = Integer.getInteger("123");

是我的编译器 getInteger 在零是静态的情况下?那没有任何意义!

发生了什么?

有帮助吗?

解决方案

大局

这里有两个问题:

  • Integer getInteger(String) 不做你认为做的事情
    • 它返回 null 在这种情况下
  • 来自 Integerint 引起自动盒
    • 自从 Integernull, 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").

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top