IllegalArgumentException NullPointerExceptionまたはnullのパラメータ?[定休日]
-
08-06-2019 - |
質問
私は簡単な設定メソッド物件 null
ではこの特定の物件です。いかに繋げるために、たくさんのこうした状況:ばんず IllegalArgumentException
, や NullPointerException
?からjavadocs、も適しています。が何らかの理解規格とは何ですか?こちらは日本だけとめたものにするべきなのだ。両方とも本当に正しいのですか。
解決
そのような IllegalArgumentException
れない場合 null
する許容値は、 NullPointerException
いた場合にスローされます。きようとしていた 使用 可変とすること null
.
他のヒント
使用 IllegalArgumentException
(IAE) NullPointerException
(NPE)以下の理由
第一に、 NPE JavaDoc 明示的にリストの場合NPEが適しています。通知がすべてスローされ により、実行 時 null
は不適切に使用す.対照的に、 IAE JavaDoc かたならな"ことを示すためにスローされますメソッドに渡された違法または不適切な引数です。" ユ!
第二に、して対処してくださいNPEにスタックトレースで、あなたは何を仮定していますか?ということになろう人、逆参照さ null
.きIAEに関する呼び出し側のメソッドのトップのスタックに渡された不正な値です。再び、後者を前提がtrueの場合、前者は誤解を招きます。
第三に、IAE明設計に関する妥当性の判断のためのパラメータは、想定してデフォルトの選択の例外ではなぜこんなものではありませNPEょうか?あなたは異なる動作です--い皆さんを心からお待呼び出しコードの追NPEのとは別にIAEという異なる結果として?ごうとして人とコミュニケーションをより特定のエラーメッセージ?がで行うことができますの例外のメッセージテキストとにかくとしておきたいすべてのその他の不正パラメータ。
第四に、他のすべての誤ったパラメータのデータIAE、なぜ必ずしも一致?それは違法 null
するため、あるいはその値は別の例外からの他のすべての種類の不正な引数?
最後に、このように引数を与えるその他の答えのJava APIを使用NPEます。しかし、Java APIの矛盾から例外の種類の命名規則、と思うだけのエコピー(好みの)のJava APIではない引数をこれらのトランプなどを考慮し
の基準によると、 NullPointerException
.には万全の"効果的なJava"つこつイ42(初版)、アイテム60(第二版又は第72号(third edition)"との使用標準例外":
"世界の全ての誤った方法 メソッドの呼び出しで抜違法 引数が不正な状態だが、その他 例外は標準使用 ある種の不正な引数 ます。場合に呼び出し側に渡しは、null 一部のパラメータをnull値 禁止条約に至っ るとNullPointerExceptionをスローされ よIllegalArgumentException."
私はすべて賛成投 IllegalArgumentException
のためのnullパラメータは、現在まで、ときに気付いたので、 java.util.Objects.requireNonNull
法Java7.その方法、そうでない:
if (param == null) {
throw new IllegalArgumentException("param cannot be null.");
}
ことができるの?
Objects.requireNonNull(param);
とをスローします、 NullPointerException
パラメータを渡すのでは null
.
れる手法でバーン中 java.util
いることができるように存在するよく参加してくれる旨の表示を投げ NullPointerException
は、"Javaうやってうまいもの"です。
しようとして決定します。
この議論ハードデバッグが偽できるのでのコースを提供へのメッセージ NullPointerException
何を言ってるのかわからねーとがnullの場合には、かなはnullになります。う IllegalArgumentException
.
一利 NullPointerException
ることで、高いパフォーマンスが重視されるコードが必明示的なチェックnullの場合( NullPointerException
シューティングのエラーメッセージ)だけに依存し NullPointerException
またときに自動的にメソッドの呼び出しはnullのパラメータとします。すメソッドの呼び出しを迅速に(なに速い)、これは本質的に同じ効果だけでなユーザー向けのサインです。多倍はあるんじゃないでしょうかより良いチェックを明示的に手を立てる上で役立つメッセージを表示するパラメータがnullの場合にも良いオプションを変更する場合には性能の赴く、公表された契約の方法/コンストラクタです。
してしまいがちなのデザインのJDK図書館、特集と並行処理(ジョシュア状Doug ー、ヤノウハウをデザインの固体Api).とにかく多くのApiでは、JDKでの積極的な投 NullPointerException
.
例えば、Javadocのための Map.containsKey
状態:
@throws NullPointerExceptionのキーがnullの場合、この地図 ながnullキーを許可しない場合(任意)。
今でも十分高く、これまで投ご自身のNPE.のコンベンションは、パラメータ名がnullの場合には、メッセージの例外です。
パターンにう:
public void someMethod(Object mustNotBeNull) {
if (mustNotBeNull == null) {
throw new NullPointerException("mustNotBeNull must not be null");
}
}
うん、悪い値を設定例外をスロー時以降のその他のコードを利用しようとします。このデバッグ、悪夢です。しなければなりませんの情報を手に入れような"原則とします。
投票ッJason Cohenの引数でいます。私dismemberによって成されます。;-)
の NPE JavaDoc 明示的に言うように、 "その他不正使用の場合は、nullオブジェクト".だったのに限る場合の実行時の出会いの場合、nullでない、その全てにおいて、必要な場合が定義するかに簡潔に表現.
できないのだとは間違いなものと仮定して封止用に適切までにない介護または通知かどうかをnullに逆参照された不適切な対るかどうかの方法を検出して不適切なnullの場合、焼成の例外。
-
- では具体的には、自然の不正操作
- ロジックが間違って可能にnullが非常に異なるロジックが間違って可能に不正な値です。例えば、私の妥当性を検証データが入力したユーザーが取得した値ではこうしたことは認められない、とエラーは、エンドユーザーである。だnullの場合、このプログラマはエラーになります。
- 無効な値が原因のようなスタックが溢れる、out of memoryエラー、構文解析例外。実際、最も誤差は一般に、ある時点で、無効な値にはなんらかの方法で電話します。このような理由から、私は見IAEとして、実際に 最も一般 全ての例外はRuntimeException.
実際に、その他の無効な引数ですべての種類のその他の例外をスローしました。 UnknownHostException, FileNotFoundException, 様々な構文エラーは例外 IndexOutOfBoundsException, 認証失敗等 など。
一般に、思NPEはmalignedで伝統的に結び付いていたコードにエラーが発生した場合の な高速の原理.すると、JDKの失敗を生成するためNPEのメッセージ文字列うした負の感情などを設立。実際の差NPE、IAEからの実行時の視点が厳しくするためのものでした。その観点から、より精密ないの名の通り、より明確な形でお願いしまして、呼び出し側に返します。
この"聖戦"スタイル質問です。その他、両方の選択肢が人が自分の好みて、それらを守るには、死亡することはまれである。
場合で setter
方法 null
が渡されると思うことができるとされていることを意をスローする IllegalArgumentException
.A NullPointerException
そういう場合にはんを実際に使用する null
.
こうして利用でき null
, NullPointer
.だれに渡されたもの null
, IllegalArgument
.
Apache Commons Langには NullArgumentException そのものをここで説明されてい:でIllegalArgumentExceptionとその唯一のコンストラクタの名前を引数にて非nullになります。
を感じることを投げようNullArgumentExceptionはIllegalArgumentExceptionをより正確に記述するので、特別な事情により同僚とに限定されていないので、製造メーカーの海外販路開拓を推ブロッホのアドバイス用になれます。
んとか取れたりします。失敗し、早期に失敗します。良い例外の言葉です。
に関するご質問のある例外をスローする主な個人の味わいです。心IllegalArgumentExceptionされてきていることから特定の以上を使用NPEか聞かせていただきましては問題があったとういう議論のあとにメソッドに渡されないと価値が発生していながらの方法です。
私の2つのセント
の受け入れれば実用上の利用 IllegalArgumentException(String message) を宣言するパラメータは無効で、出来る限り詳細に...という言葉で呼ばれることも多いるパラメータがnullの場合を例外のnull以外の場合、およって次のような処理が行わこ
if( variable == null )
throw new IllegalArgumentException("The object 'variable' cannot be null");
でほとんどの理由に暗黙のうちに使用を"NullPointerException".は、NullPointerExceptionがスローされる例外は、Java仮想マシンを行なったとき、コードが実行されるnull以外の参照など toString()).
実際、質問を投げIllegalArgumentExceptionはNullPointerExceptionは拙ビューのみの"聖戦"と少数株主持incomlete理解で例外処理Java.一般のルールは簡単で、下
- 引数の制約違反を明記してくださいこのときの(->高速になされることを避けるために、不正な国力が低下していく傾向がありデバッグ
- の場合は無効なnullポインタは、理由の如何にかかわらず、投げNullPointerException
- 場合には、不正な配列/コレクションの指数を投げArrayIndexOutOfBounds
- の場合は負の配列/コレクションのサイズ、スロー NegativeArraySizeException
- 場合には、不正な引数が範囲に含まれていない、というより特定の例外タイプを捨て、IllegalArgumentExceptionとして箱
- 一方、制約違反以内の場からすることを確認することにより、高速に失敗したあの有効な理由、及びrethrowとしてIllegalStateExceptionはより特定のチェック例外です.なのだが、ほかの原NullPointerException,ArrayIndexOutOfBoundsなどはこのケースです!
少なくとも三つの非常に良い理由の場合のマッピングすべての種類の引数に制約違反をIllegalArgumentException、第三れほど厳しているマークの悪いスタイル:
(1)プログラマーは、安全はすべての場合の引数に制約違反IllegalArgumentExceptionがスローされ、大多数の標準クラスはこの例外はし箱がない場合より特定の種類の例外です。いる地図の場合の引数に制約違反をIllegalArgumentExceptionおAPIだけるプログラマの不満をご利用の授業としての標準ライブラリは主に異なる規則を侵害するお、多くのAPIユーザーとして利用。
(2)マッピングの例外実際の結果と異なる種類の異常による単一の継承:すべてのJavaの例外クラスは、このため、サポートシングルの継承だけます。そのため、ありませんの作り方の例外は真っとNullPointerException、IllegalArgumentExceptionが、サブクラスでだけからは継承した投さないと、IllegalArgumentExceptionが発生した場合はnull引数をこのためることが難しくなってAPIのユーザーの区別の問題でもプログラムではプログラムによって、問題を解消してください例えば給電により、デフォルト値をコピー!
(3)マッピングを実際に生の危険性はバグのマスキング:のための地図の引数制約違反へのIllegalArgumentExceptionきコード外try-catchあらゆる方法が制限引数になります。しかし、単に追RuntimeExceptionことがcatchブロックですので、そのリスクをマッピングの記録RuntimeExceptionsによってスローされるlibery方法以内にお入IllegalArgumentExceptionる場合であっても、なによる引数に制約の違反に対するばなければなりませんでしも特定のものは、こうした取り組みませんからお客様を保護する目的で、場合には誤って地図る非正規滞在実行時例外の別のAPI(バグ)をIllegalArgumentExceptionのAPIとなります。でも最も注意をマッピングに従ってリスクマスキングプログラムのエラーのその他の図書館メーカーの引数として与えた場合、その制約違反のメソッドのユーザーは、単にhillareous行動!
標準練習の規則により、滞在はシンプルに、例外の原因テゴ、固有のものです。メソッドの呼び出し側は、規則やすいなどの-悩んでいるときには文書化し、実行時例外などからの不正価値のいずれかの繰り返しのデフォルトの(この特定の例外は必要です。)、または訂正コード -の場合におenccounter実行時の例外で記載されていないかの指定されたセット引数のファイルにバグ報告の方法のメーカーのためのいずれかをコードまたはその書類が固定されます。
一般的には、開発者は ない 投NullPointerException。この例外がスローされる実行時コードを逆参照変数の値はnullになります。したがって、法人を明示的にnullを許可し、眩しさのなかで起こっている場合はnull値をNullPointerExceptionき、IllegalArgumentExceptionをスローします。
例外をスローする専用 null
引数のうち NullPointerException
またはカスタムタイプ)自動化 null
試験されます。この自動検査ができる反射とのセットのデフォルト値は、 グァバ's NullPointerTester
.例えば、 NullPointerTester
いう話は、以下の方法...
Foo(String string, List<?> list) {
checkArgument(string.length() > 0);
// missing null check for list!
this.string = string;
this.list = list;
}
...二のリスト引数: "", null
や null, ImmutableList.of()
.この試験とそれぞれの通話すのを期待 NullPointerException
.この実装を渡す null
リストは ない 作 NullPointerException
.なしな作 IllegalArgumentException
ので NullPointerTester
起用のデフォルトの文字列 ""
.の場合 NullPointerTester
見込み NullPointerException
のための null
値を拾っていることになる場合もあります場合であると期待しています IllegalArgumentException
, でミスをします。
としての主観的な質問のこの閉じているべきであるが、まだまだ開場:
この内部政策ので使用前の雇用くことになっていった。これらはすべてメモリ上からなのでどうかよろしくお願いします、正確な文言.このことは特筆に値するものを使用しなかった次の例外を除き、その範囲を超えての問題をもたらしていました。のチェック例外を除いた利用下の3つの主要分類する。
NullPointerException:かないと価値がわかりません。NPEsがスローされ、VMがdereferencing nullを参考にした。全ての努力がかかり認められないスローされます。@Nullableと@NotNullべきと組み合わせて使用することによりコード解析ツールに見られます。
IllegalArgumentException:場合にスローされます引数関数には合わない場合の公文書であり、そのようなエラーを特定できると述べての引数に渡されます。OPの状況がこれにあたります。
IllegalStateException:場合にスローされる関数が呼び出され、その引数は予想外のものは対応していない状態のオブジェクトのメソッドは会員です。
例えば、内部のバージョンのIndexOutOfBoundsException用いた長さです。一つのサブクラスのIllegalStateException、指定されたインデックスよりもかなり大きいものの長さです。その他のクラスのサブクラスIllegalArgumentException、指定されたインデックスはマイナスであった。この恐れがありますので追加品目以上のオブジェクトの引数が有効ですが負の数でない有効になります。
しかし、このシステムの作品も、人に説明できないの区別もコメントありがとうございます"の種類によってはエラーでは非常に容易なものになるだろうき出しなければならない。もできない場合は実際に出ビジネスを行なっていることができがあるエラーを追加のデバッグ情報"といいます。
NullPointerException:取扱い場合は、Nullの場合は中に入れの主張のNPEがスローされます。だから、主張のほか、シンプルで飽きの来ない定その他の二種類です。可能な場合は、デバッグした場合の主張があります。
IllegalArgumentException:いようにお電話サイトです。の場合の値が渡されたから別の機能、なぜ受けている間違った値です。の場合は通の引数を増殖させるエラーチェックを呼び出しスタックでス、観光に幅広くご利用いただける機能が返さないますが、ご了承ください。
IllegalStateException:ていないという関数を正しいです。ご利用の場合は一つの引数をチェックして、IllegalArgumentExceptionをスローし記述する。その伝播の頬にスタックでス、観光に幅広くご利用いただけます。
とにかく作業できるだけコピーするIllegalArgumentAssertionsのスタックです。ありませんでも正常に動作するように伝搬しIllegalStateExceptionsはNullPointerExceptionsのスタックのために何かをな機能です。
たかった単一にNull引数からその他の不正な引数から除外IAE名NullArgumentException.なものが必要なの読み込み例外のメッセージをもたらすであろうと確信してnull引数を渡された入方法及び読み込みのメッセージを、まる引数がnullになります。まだまだでキャッチNullArgumentException、IAEハンドラが自分のログができますの比較動画をご覧ください。
の二...いに重ならな?のみと重複する部品全体で両分収録。私の見るところでは:
throw new IllegalArgumentException(new NullPointerException(NULL_ARGUMENT_IN_METHOD_BAD_BOY_BAD));
アイテムがコレクションの一部と null
不使用 NullPointerException
よ IllegalArgumentException
.例えば、比較を含むセット null
セットになることを拒否 null
, 最初のセットと呼 containsAll
の他のキャラクターの NullPointerException
--な IllegalArgumentException
.(私見の実施 AbstractSet.equals
.)
き合いをチェックの例外にはantipatternとの比較レーションを含む null
は、コレクションすることになれ null
るバグをとことん すべ 作例外は、とて null
コレクションの中で全ん。しかしませんが、あとは言い equals
すべき例外がスローされその場合、穴にはまってるということを思い出し NullPointerException
が必要である状況にはなってしまうのです。("IAE前NPEを除後に"c"...")
NullPointerExceptionがスローされるアクセスオブジェクトの参照を可変する現在の値がnullの場合
IllegalArgumentException場合にスローされる方法で受け引数形式とは違った方法を期待
に応じてシナリオでは、 IllegalArgumentException
のおすすめ null
が有効な値でないおます。
理想的にはランタイム例外はスローされます。チェック例外で事業を除)ができるようにすることだ。だから例外がスローされ、ログインでmisguidesの開発を通します。代わりに事業を除いたこともあるパニックになり、通常は無視されがブログダウンロード
の定義からのリンクの二つの例外は IllegalArgumentException:ことを示すためにスローされますメソッドに渡された違法または不適切な引数です。NullPointerException:場合にスローされアプリケーションが試み利用にnullがある場合にはオブジェクトが必要です。
の大きな違いは、IllegalArgumentExceptionが使用される場合をチェックするこの引数の方法が有効になります。NullPointerExceptionが使用されるまた必要に応じて、環境に適したオブジェクト"を使用する場合にはnullになります。
いすけの視点です。
の場合は、"セッタ"は、どこかになっている会員の使用後に、私が使用IllegalArgumentException.
だものを用いて(逆参照)現在のメソッドは、このスロー NullPointerExceptionに積極的に取り組む。このように、実行時のいいが、メッセージのように実行うこともことになる>の他の日とします。
について知っておきましょ覆する方法、どのようなオーバーライド法を利用します。
まず、IllegalArgumentExceptionをスローし、そのままでは明らかにされているプログラマがこれまでも無効となります。開発者で見らNPEによってスローされるVMは、他のプログラマは直ちにその誤り、やが見ランダムには、悪しきにつけ、責コードのための"buggy'.
この場合、IllegalArgumentExceptionを伝える明瞭な情報をユーザーにご利用のAPIの"べきますが、nullにはなりません".他のフォーラムのユーザーから指摘されましたし、きNPEしたい場合はどを伝え、適切な情報をユーザーを使用します。
GaryFとtweakt落とした"効果的なJava"を見逃しによる)を参照するの使用を推奨いたしますNPE.としている姿を見て、どのApiを構成する最善の方法を構築します。
別の例の春のApiを用意しています。例えば、org.springframework.豆です。BeanUtils.instantiateClass(コンストラクタctor,Object[]args)が主張する.notNull(ctor,"コンストラクタをnullにすることはできません"。org.springframework.util.を主張する.notNull(オブジェクトのオブジェクトメッセージ文字列)の方法かどうかをチェックした場合には引数オブジェクト)に渡されたがnullの場合で投新IllegalArgumentException(メッセージ)それは、org.springframework.豆です。BeanUtils.instantiateClass(...)。
を選択の場合は捨てるとNPEをご利用の方は引数に方法、その冗長化や高額の明示的にチェックのためのnullになります。と思い、VMています。