web-dev-qa-db-ja.com

Android Studio: 'xxx'を開梱すると、 'Java.lang.NullPointerException'が発生する場合があります

私は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)はオブジェクトを返し、(Integer)はそれをint型に変換して_int drinkIdd_に適合させます。

  • この情報の正確な意味を教えてください。あなたの答えは初心者に感謝されます。
  • そして、私はこのように上の行を書くことができますか? ()を使用して、getIntent()。getExtras()。get()を全体としてラップします。最終的にオブジェクトを返し、それをintに変換するためです。

    _int drinkIdd = (Integer)(getIntent().getExtras().get(EXTRA_DRINKID));
    _
7
ChuckZHB

これは、次のコードを呼び出すときのためです。

_getIntent().getExtras().get(EXTRA_DRINKID);
_

返されるオブジェクトはnullにすることができます。

Integerを使用して値をキャストする場合、Integerにnullをキャストできるため、問題はありません。

ただし、次を呼び出すと:

_int drinkIdd = (Integer)getIntent().getExtras().get(EXTRA_DRINKID);
_

ボックス化解除すると、null値をボックス化解除できないため、エラーが発生します。

次のように、getInt()の代わりにget()を使用することをお勧めします。

_int drinkIdd = getIntent().getExtras().getInt(EXTRA_DRINKID);
_

したがって、警告が表示されなくなり、コードがより堅牢になります。

どの本を読んでいるのかわかりませんが、参考文献を変更する必要があると思います。本の著者がJavaおよびAndroid APIの基本概念を理解していないため、別のAndroid著者が彼/彼女の仕事を完了するまで、あなたの学習プロセスのための本;)

注:
ラッパータイプ(整数)のオブジェクトを対応するプリミティブ(整数)値に変換することをボックス化解除と呼びます。詳細は Autoboxing and Unboxing をご覧ください。