2011年11月20日

Javaでnullを受け付けないメソッドにnullを渡したらどうなるべきか

代表的な候補としては「IllegalArgumentException」と「NullPointerException」。
5

事の起こり

都元ダイスケ🍅 @daisuke_m

今更commons-lang3を使い始めようとしている。

2011-11-19 11:02:39
都元ダイスケ🍅 @daisuke_m

しかし重大な事実発覚。commons-langで俺が一番使っているValidate#notNullの仕様が変わっとるw IAEだったはずがNPEに変わっているではないかっ。…世の中そういう流れなのかな…。

2011-11-19 11:04:44

そして問題提起してディスカッション

都元ダイスケ🍅 @daisuke_m

引数としてnullを受け付けないメソッドにnullを渡した時に飛ぶべきはNullPointerExceptionかIllegalArgumentExceptionか。って哲学っぺーよなw 俺は今までIAE派だったのだが。

2011-11-19 11:09:49
都元ダイスケ🍅 @daisuke_m

@megascus まぁ哲学だから「そう思ったから」でも良いと思うのだけど、NPEを積極的に選ぶ理由ってあります?

2011-11-19 11:12:03
log4ゆとり💉💉 @megascus

@daisuke_m そちらのほうが直感的だからですかね。汎用的な変な引数ですよりも、引数がNullです。のほうが後で利用するときに判りやすいとおもってます。

2011-11-19 11:13:26
都元ダイスケ🍅 @daisuke_m

@megascus まぁ、確かに null っていう言葉の方が illegal ってのより具体的ですから、字面的には分かりやすいですね。

2011-11-19 11:14:15
れぐたん @regtan

@daisuke_m commonsつかわないならNullPointerExceptionであってほしい。commons使うならNullArgumentExceptionであってほしい

2011-11-19 11:12:01
都元ダイスケ🍅 @daisuke_m

@regtan なるほどね。そういえばそんなのあったな的なw しかし、commons自身が Validate#notNull で NPE 投げてる事実をどう思いますかw

2011-11-19 11:13:00
れぐたん @regtan

NullArgumentExceptionはIlegalArgumentException継承してんのか。

2011-11-19 11:13:22
れぐたん @regtan

@daisuke_m 3系からかわったのか・・・引数がNullか否かだから引数が不正というわけじゃないんだよなぁ。NPEが文脈にあってるきがする。NPEに変わってしまったら以前のIAEに違和感感じる。

2011-11-19 11:18:05
れぐたん @regtan

@daisuke_m なるほど。そうであればパラメータ不正としてIAEでいいとおもうなぁ

2011-11-19 11:23:40
都元ダイスケ🍅 @daisuke_m

@regtan と、いう気持ち(nullを受け付けないメソッドに引数として渡したnullは、不正な引数である)で今までIAE飛ばして来たんだけど、lang3のValidateに罠があったイマココ。

2011-11-19 11:24:37
誰か僕の右股関節と性根を何とかしてください @kamekoopa

@daisuke_m 僕のイメージ的にNPEはnull参照しちゃった例外、IAEはその引数はアカンよ例外なのでIAEの感覚あります。

2011-11-19 11:18:03
Yuichi Sakuraba @skrb

@daisuke_m AssertionError まぁ、実際に使うことはないと思うけど...

2011-11-19 11:16:12
都元ダイスケ🍅 @daisuke_m

@skrb うーん、引数チェックでAssertionError飛ばしていいのはprivate or default限定かなー、と思いました。

2011-11-19 11:17:37
都元ダイスケ🍅 @daisuke_m

俺がNPEではなくIAEを選択した理由はNPEはコード上でthrowしなくても飛ぶものだから。null参照にメッセージを送ってしまったのか、明示的にthrowされたのかがぱっと見分からないから。IAEに統一しておくと、NPEが飛んだときはnull参照にメッセージしたと確定できる。

2011-11-19 11:16:33
都元ダイスケ🍅 @daisuke_m

assertionって「ここはこうなる訳が無い」という、まさに "表明” なんすよね。だから、コード書いた人本人は「ミスでもない限り絶対起こらない」と思ってる。

2011-11-19 11:18:49
Suguru ARAKAWA @ashigeru

@daisuke_m ミスというか、将来別の個所を変更する際にそうあってはならないという前提をコード内に埋めてる感じだなぁ

2011-11-19 11:24:46
都元ダイスケ🍅 @daisuke_m

@ashigeru なるほどね。俺の想定した「ミス」はそれも含んでるイメージだった。変更ミス。元々の設計意図を汲み取れなかったミス。ってミス連呼するとやだなw

2011-11-19 11:26:35
Yuichi Sakuraba @skrb

@daisuke_m 実際には、IAEを使うことが多いです。もしくは、アプリケーションによるのですが、nullでもなんとなく動いてしまうようにするという設計にする場合もあります。GUIとかはnullでも動くように作ってしまうことが多いです。

2011-11-19 11:23:45
都元ダイスケ🍅 @daisuke_m

@skrb なるほど。自分は結構fail-fast寄りなので、執拗にチェックして想定外をぶっとばす傾向にありますw

2011-11-19 11:28:01
都元ダイスケ🍅 @daisuke_m

1) commons-lang2系に甘んじる、 2) lang3に移行してNPE派に改宗する、 3) Validateの利用を諦めて自作のチェックロジックを作る …瀬戸際だなぁw

2011-11-19 11:38:27

コメント

コメントがまだありません。感想を最初に伝えてみませんか?