category: Java
DATE : 2009/06/21 (Sun)
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が発生した箇所の処理を細かく見ていくと、以下のようになります。
- 「map.get(key)」でBooleanオブジェクトを取り出す。
- if文の評価にはプリミティブ値のboolean値が必要。
- そのため、取り出されたBooleanオブジェクトをプリミティブ値のboolean値にオートアンボクシングする。
問題だったのは、Mapから取り出したBooleanオブジェクトがnullになっていたことでした。キーに対応づく値がMapに存在しなかったためです。nullオブジェクトをアンボクシングしようとすると、NullPointerExceptionが発生します。だから上記の箇所でNullPointerExceptionが発生していたのです。
こういう場合、オートアンボクシングでNullPointerExceptionが発生しないようにするには、Mapから値を取り出す際にはオートアンボクシングせず、取り出した値がnullではないか確かめるほうが安全です。
(;^ω^)問題が発生した書き方だとコードがやけにすっきりするので、nullのことをつい忘れてしまいました。
参考文献
PR
忍者ブログ [PR]