当前位置: 首页 > 面试题库 >

Android Studio:取消装箱“ xxx”可能会产生“ java.lang.NullPointerException”

滕项明
2023-03-14
问题内容

我正在关注Android图书示例:

//Get the drink from the intent
int drinkIdd = (Integer)getIntent().getExtras().get(EXTRA_DRINKID);
Drink drink = Drink.drinks[drinkIdd];

该项目可以在Android Studio中运行,但在线上带有黄色警告:

int drinkIdd = (Integer)getIntent().getExtras().get(EXTRA_DRINKID);

与:

info: Unboxing of '(Integer)getIntent().getExtras().get(EXTRA_DRINKID)' may produce 'java.lang.NullPointerException'

根据我的理解,get(EXTRA_DRINKID)返回一个Object,然后(Integer)将其转换为int类型,以与满足int drinkIdd

  • 您能告诉我该信息的确切含义吗,对于初学者来说,您的回答将是值得的。
  • 我可以这样写上限吗?使用 () 将getIntent()。getExtras()。get()打包为一个整体,因为它最终返回了一个对象,然后将其转换为int。
    int drinkIdd = (Integer)(getIntent().getExtras().get(EXTRA_DRINKID));
    

问题答案:

这是因为调用以下代码时:

getIntent().getExtras().get(EXTRA_DRINKID);

返回的对象可以为null。

使用Integer转换值时,它不会抱怨,因为您可以将null转换为Integer。

但是,当您致电以下内容时:

int drinkIdd = (Integer)getIntent().getExtras().get(EXTRA_DRINKID);

因为当您取消装箱时,它将抱怨,因为您无法取消装箱 null 值。

您最好使用getInt()而不是get()这样:

int drinkIdd = getIntent().getExtras().getInt(EXTRA_DRINKID);

因此,您不会再收到警告,并使您的代码更健壮。

我不知道您正在读什么书,但我认为您需要更改参考书目。看来这本书的作者还没有掌握Java和Android
API的基本概念。因此,在作者完成工作之前,您需要使用另一本Android书籍进行学习;)

注意:
将包装器类型(Integer)的对象转换为其对应的原始(int)值称为拆箱。在自动装箱和拆箱中了解更多信息。



 类似资料:
  • 自JDK5.0以来,Java引入了自动装箱/取消装箱。这个技巧很简单而且很有帮助,但是当我开始测试包装器类和原始类型之间的不同转换时,我真的很困惑自动装箱的概念在Java是如何工作的。例如: 拳击 在尝试了不同的情况(、、、)后,编译器接受的唯一情况是做作运算符右侧值的类型为。当我查看的源代码时,我发现它只实现了一个带有参数的构造函数。 所以我的结论是自动装箱的概念是基于在包装类中实现的构造函数。

  • 我有很多这样的电话: AndroidStudio告诉我,他们可能会获得: -如果第二个参数为null,方法返回null-如果第二个参数为null,否则返回null -一个典型的方法,如果传递给它true将引发异常 检查可以配置为使用自定义注释(默认情况下将使用来自annotations.jar的注释) 幸运的是,everithing可以工作,但我可以对这段代码进行改进吗?

  • 问题内容: 我正在从第三方网站(家庭用电)中检索JSON,并且根据我从该站点的要求,返回的JSON可能是数组,也可能不是数组。例如,如果我请求我的智能电表列表,则会得到以下信息(由于尺寸较大,结果被截断了): 其中 gwrcmd 是单个元素。 但是,如果我要求最近半小时用电,则会得到以下信息: 看看 gwrcmd 现在是一个数组吗? 在我的Go应用程序中,我有一个看起来像这样的结构(再次被截断了一

  • 请注意,对于某些数字,引用比较将产生正确的结果,因为Integer类维护了到之间的值的内部缓存(另请参阅TheLostMind的注释)。这就是为什么我在示例中使用的原因,也是为什么我特别询问取消装箱/装箱而不是比较结果的原因。

  • 我正在阅读jls§5.1.7,它说有9种拳击类型,第9种是拳击 然后我读到的拆箱转换会抛出一个。好的,这很明显。那么为什么的装箱不会抛出一个以及装箱值有什么用呢?

  • 我知道拳击是怎么做的。例如,当你写 Integer 时,正在调用 同样,我也可以看到拆箱的实现代码吗? 更新:在建议的问题中得到了回答。