Android Studio:“ xxx”的拆箱可能会产生“ java.lang.NullPointerException”

Chu*_*ZHB 6 java unboxing android-studio

我正在关注Android图书示例:

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

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

int drinkIdd = (Integer)getIntent().getExtras().get(EXTRA_DRINKID);
Run Code Online (Sandbox Code Playgroud)

与:

info: Unboxing of '(Integer)getIntent().getExtras().get(EXTRA_DRINKID)' may produce 'java.lang.NullPointerException'
Run Code Online (Sandbox Code Playgroud)

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

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

    int drinkIdd = (Integer)(getIntent().getExtras().get(EXTRA_DRINKID));
    
    Run Code Online (Sandbox Code Playgroud)

ישו*_*ותך 6

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

getIntent().getExtras().get(EXTRA_DRINKID);
Run Code Online (Sandbox Code Playgroud)

返回的对象可以为空。

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

但是当您调用以下内容时:

int drinkIdd = (Integer)getIntent().getExtras().get(EXTRA_DRINKID);
Run Code Online (Sandbox Code Playgroud)

因为当您拆箱时,它会抱怨,因为您无法拆箱值。

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

int drinkIdd = getIntent().getExtras().getInt(EXTRA_DRINKID);
Run Code Online (Sandbox Code Playgroud)

所以你不会再收到警告并使你的代码更健壮。

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

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