忍者ブログ
[379] [378] [377] [376] [375] [374] [373] [372] [371] [370] [369]

DATE : 2024/04/27 (Sat)
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


DATE : 2009/06/21 (Sun)

Mapから値を取り出すと同時にオートアンボクシングを使用する場合は、nullが出てくる可能性を考えなければなりません。

Mapからboolean値を取り出してif文で条件分岐をさせるコードを書いたら、NullPointerExceptionが発生してしまいました。NullPointerExceptionが発生した箇所は下記の通りです。

private void function(String key, Map<String, Boolean> map) {
    ...
    if (map.get(key)) {    // NullPointerException発生
        ....
    }
    ...
}

初めは、MapがnullだったためNullPointerExceptionが発生したのかと思いました。しかし動作を調べてみても、Mapにはきちんとインスタンスが割り当てられていました。

実は、NullPointerExceptionが発生していたのは、ラッパークラスのBooleanオブジェクトからプリミティブ値のboolean型へと変換を行うオートアンボクシングの部分でした。NullPointerExceptionが発生した箇所の処理を細かく見ていくと、以下のようになります。

  1. 「map.get(key)」でBooleanオブジェクトを取り出す。
  2. if文の評価にはプリミティブ値のboolean値が必要。
  3. そのため、取り出されたBooleanオブジェクトをプリミティブ値のboolean値にオートアンボクシングする。

問題だったのは、Mapから取り出したBooleanオブジェクトがnullになっていたことでした。キーに対応づく値がMapに存在しなかったためです。nullオブジェクトをアンボクシングしようとすると、NullPointerExceptionが発生します。だから上記の箇所でNullPointerExceptionが発生していたのです。

こういう場合、オートアンボクシングでNullPointerExceptionが発生しないようにするには、Mapから値を取り出す際にはオートアンボクシングせず、取り出した値がnullではないか確かめるほうが安全です。

(;^ω^)問題が発生した書き方だとコードがやけにすっきりするので、nullのことをつい忘れてしまいました。

参考文献

PR
忍者ブログ [PR]
ブログ内検索
最近の状況
リンク
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック
ブログ内検索
最近の状況
リンク
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック