[解決済み】なぜObjects.requireNonNull()を使用しなければならないのですか?)
2022-03-26 23:43:16
質問
Oracle JDK の多くの Java 8 メソッドで
Objects.requireNonNull()
を投げますが、これは内部的には
NullPointerException
が与えられたオブジェクト(引数)である場合、そのオブジェクトは
null
.
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
しかし
NullPointerException
はとにかく投げられます。
null
オブジェクトが再参照されます。では、なぜこのように余計なNULLチェックを行い
NullPointerException
?
1つの明白な答え(または利点)は、コードがより読みやすくなることであり、私もそう思います。しかし、それ以外に
Objects.requireNonNull()
をメソッドの冒頭で使用します。
どのように解決するのですか?
ものづくりができるから 明示的 することで 例えば
public class Foo {
private final Bar bar;
public Foo(Bar bar) {
Objects.requireNonNull(bar, "bar must not be null");
this.bar = bar;
}
もっと短くてもいい。
this.bar = Objects.requireNonNull(bar, "bar must not be null");
今、あなたは 知る :
-
いつ
を使用して Foo オブジェクトが正常に作成されました。
new()
- では その バー フィールドは 保証 は非NULLである。
今日、Foo オブジェクトを作成する場合、次のように比較します。 明日 そのフィールドを使用するメソッドを呼び出すと、throwsします。おそらく、なぜその参照が NULL だったのか、明日になってもわからないでしょう。 昨日 コンストラクタに渡されたとき!
つまり、このメソッドを使って明示的にチェックすることで 着信 を参照することができます。 制御 例外を発生させるタイミングを指定します。そして、ほとんどの場合、あなたは できるだけ早く失敗する !
大きなメリットは
- と言ったように 制御された 動作
- デバッグがしやすい - オブジェクトの生成のコンテキストで投げ出すからです。ログやトレースから何が問題だったのかがわかる可能性がある時点で!
-
そして、上に示したように、このアイデアの真の威力は、次のような場合に発揮されます。
ファイナル
のフィールドがあります。なぜなら、今
他のコード
を安全に仮定することができます。
bar
はnullではないのでif (bar == null)
を他の場所でチェックします。
関連
-
[解決済み] publicId と systemId の間に空白が必要です。
-
[解決済み] 文字列の巻き方
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] ArrayListの初期化を1行で行う。
-
[解決済み] なぜゲッターとセッター/アクセッサーを使うのですか?
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み】なぜJavaの+=, -=, *=, /=複合代入演算子はキャスティングを必要としないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] tempとは何ですか、またjavaにおけるtempの用途は何ですか?
-
[解決済み] 環境変数JAVA_OPTSの使い方を教えてください。
-
[解決済み] なぜJPAには@Transientアノテーションがあるのですか?
-
[解決済み] Java Swingで複数のボタンに対して複数のActionListenersを追加する方法
-
[解決済み] mavenのコンパイルに失敗するのはなぜですか?
-
[解決済み] ファイルを作成せずに、ファイルが存在するかどうかをチェックする
-
[解決済み] JAVA_OPTIONS、JAVA_TOOL_OPTIONS、JAVA_OPTSの違いについて
-
[解決済み] javaでAnnotation Inheritanceのようなものはあるのでしょうか?
-
[解決済み] javaでメソッドを呼び出すプログラムのエラー修正
-
[解決済み] Java: getInstanceとStaticの比較