Javaでnullを受け付けないメソッドにnullを渡したらどうなるべきか
事の起こり
しかし重大な事実発覚。commons-langで俺が一番使っているValidate#notNullの仕様が変わっとるw IAEだったはずがNPEに変わっているではないかっ。…世の中そういう流れなのかな…。
2011-11-19 11:04:44そして問題提起してディスカッション
引数としてnullを受け付けないメソッドにnullを渡した時に飛ぶべきはNullPointerExceptionかIllegalArgumentExceptionか。って哲学っぺーよなw 俺は今までIAE派だったのだが。
2011-11-19 11:09:49@daisuke_m そちらのほうが直感的だからですかね。汎用的な変な引数ですよりも、引数がNullです。のほうが後で利用するときに判りやすいとおもってます。
2011-11-19 11:13:26@megascus まぁ、確かに null っていう言葉の方が illegal ってのより具体的ですから、字面的には分かりやすいですね。
2011-11-19 11:14:15@daisuke_m commonsつかわないならNullPointerExceptionであってほしい。commons使うならNullArgumentExceptionであってほしい
2011-11-19 11:12:01@regtan なるほどね。そういえばそんなのあったな的なw しかし、commons自身が Validate#notNull で NPE 投げてる事実をどう思いますかw
2011-11-19 11:13:00@daisuke_m 3系からかわったのか・・・引数がNullか否かだから引数が不正というわけじゃないんだよなぁ。NPEが文脈にあってるきがする。NPEに変わってしまったら以前のIAEに違和感感じる。
2011-11-19 11:18:05@regtan と、いう気持ち(nullを受け付けないメソッドに引数として渡したnullは、不正な引数である)で今までIAE飛ばして来たんだけど、lang3のValidateに罠があったイマココ。
2011-11-19 11:24:37@daisuke_m 僕のイメージ的にNPEはnull参照しちゃった例外、IAEはその引数はアカンよ例外なのでIAEの感覚あります。
2011-11-19 11:18:03@skrb うーん、引数チェックでAssertionError飛ばしていいのはprivate or default限定かなー、と思いました。
2011-11-19 11:17:37俺がNPEではなくIAEを選択した理由はNPEはコード上でthrowしなくても飛ぶものだから。null参照にメッセージを送ってしまったのか、明示的にthrowされたのかがぱっと見分からないから。IAEに統一しておくと、NPEが飛んだときはnull参照にメッセージしたと確定できる。
2011-11-19 11:16:33assertionって「ここはこうなる訳が無い」という、まさに "表明” なんすよね。だから、コード書いた人本人は「ミスでもない限り絶対起こらない」と思ってる。
2011-11-19 11:18:49@daisuke_m ミスというか、将来別の個所を変更する際にそうあってはならないという前提をコード内に埋めてる感じだなぁ
2011-11-19 11:24:46@ashigeru なるほどね。俺の想定した「ミス」はそれも含んでるイメージだった。変更ミス。元々の設計意図を汲み取れなかったミス。ってミス連呼するとやだなw
2011-11-19 11:26:35@daisuke_m 実際には、IAEを使うことが多いです。もしくは、アプリケーションによるのですが、nullでもなんとなく動いてしまうようにするという設計にする場合もあります。GUIとかはnullでも動くように作ってしまうことが多いです。
2011-11-19 11:23:451) commons-lang2系に甘んじる、 2) lang3に移行してNPE派に改宗する、 3) Validateの利用を諦めて自作のチェックロジックを作る …瀬戸際だなぁw
2011-11-19 11:38:27