1. ホーム

[解決済み】なぜ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) を他の場所でチェックします。