Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么int num=Integer.getInteger(“123”)抛出NullPointerException?_Java_Integer_Nullpointerexception_Api Design_Autoboxing - Fatal编程技术网

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()。这篇博文很好地解释了为什么: