検索

ホームページ  >  に質問  >  本文

NullPointerException とは何ですか?またその修正方法は?

<p>Null ポインタ例外 (<code>java.lang.NullPointerException</code>) とは何ですか?またその原因は何ですか? </p> <p>例外によるプログラムの早期終了を防ぐために、原因を特定するにはどのような方法/ツールを使用できますか? </p>
P粉649990273P粉649990273462日前615

全員に返信(2)返信します

  • P粉252116587

    P粉2521165872023-08-24 09:14:35

    NullPointerException は、オブジェクトへの参照と同様に、メモリ内の任意の場所 (null) への参照を使用しようとしたときに発生する例外です。 null 参照でメソッドを呼び出すか、null 参照を持つフィールドにアクセスしようとすると、NullPointerException がトリガーされます。これらが最も一般的ですが、他のメソッドも NullPointerException javadoc ページにリストされています。

    NullPointerException を説明するために私が考えることができる最速のコード例は、おそらく次のとおりです。

    リーリー

    main

    内の最初の行で、Object 参照 objnull に明示的に設定します。これは、参照はあるものの、オブジェクトを指していないことを意味します。その後、そのメソッドを呼び出して、参照をオブジェクトを指すものとして処理しようとします。参照が指す場所には実行するコードがないため、NullPointerException が発生します。 (これは技術的な質問ですが、言及する価値があると思います。null への参照は、無効なメモリ位置を指す C ポインタと同じではありません。null ポインタは、実際にはどこを指すわけでもありません。無効な位置は 1 つだけ異なります。)

    返事
    0
  • P粉593536104

    P粉5935361042023-08-24 00:10:48

    Java には主に 2 つのタイプの変数があります:

    1. プリミティブ: データを含む変数。元の変数のデータを操作したい場合は、変数を直接操作できます。慣例により、プリミティブ型は小文字で始まります。たとえば、int または char 型の変数はプリミティブです。

    2. Reference : オブジェクト のメモリ アドレスを含む変数、つまり オブジェクト ## を参照する変数#コード>. 参照変数によって参照される Object を操作したい場合は、逆参照 する必要があります。逆参照では通常、メソッドまたはフィールドにアクセスするために . を使用するか、配列のインデックスを作成するために [ を使用する必要があります。慣例により、参照型は通常、大文字で始まる型で表されます。たとえば、Object 型の変数は参照です。

    3. 次のコードを考えてみましょう。このコードでは、
    int

    型の プリミティブ 変数を宣言しますが、初期化はしません。 リーリー これらの 2 行は、x

    に値が指定されておらず、

    x の値を使用して y > を指定しようとしているため、プログラムをクラッシュさせます。すべてのプリミティブは、操作する前に使用可能な値に初期化する必要があります。 さあ、話は面白くなります。 参照

    変数は

    null に設定できます。これは、「何も参照していません」を意味します。この方法で参照変数を明示的に設定すると、参照変数で null 値を取得するか、参照変数が初期化されず、コンパイラがそれを捕捉しません (Java が自動的に変数を次のように設定します)。 # ##ヌル ###)。 明示的または Java 経由で自動的に参照変数を null に設定し、それを 逆参照しようとすると、NullPointerException が発生します。

    NullPointerException (NPE) は通常、変数を宣言したが、オブジェクトを作成せず、変数の内容を使用しようとする前にそれを変数に割り当てなかった場合に発生します。つまり、実際には存在しないものを参照していることになります。 次のコードを使用します: リーリー

    最初の行では

    num という名前の変数を宣言していますが、実際にはまだ参照値が含まれていません。何を指したいのかを指定していないため、Java はそれを null

    に設定します。

    2 行目では、

    new キーワードを使用して、タイプ Integer のオブジェクトをインスタンス化 (または作成) し、参照変数 num

    が割り当てられます。

    Integer オブジェクトに。 オブジェクト を作成する前に num を逆参照しようとすると、NullPointerException

    が発生します。最も単純なケースでは、コンパイラが問題を検出して、「

    num が初期化されていない可能性があります 」と通知しますが、場合によっては、オブジェクトを直接作成しないコードを作成することもあります。 たとえば、次のようなメソッドが考えられます: リーリー この場合、オブジェクト obj は作成されませんが、doSomething()

    メソッドを呼び出す前にオブジェクトが作成されたものと想定されます。このメソッドは次のように呼び出すことができることに注意してください:

    リーリー

    この場合、

    objnull であり、ステートメント obj.myMethod()

    NullPointerException > をスローします。 メソッドが上記のメソッドのように、渡されたオブジェクトに対して何らかの操作を実行することを目的としている場合、NullPointerException をスローするのが適切です。これはプログラマのエラーであり、プログラマはデバッグのためにその情報が必要であるためです。

    メソッド ロジックによってスローされる NullPointerException 例外に加えて、メソッド パラメーター内の null 値をチェックし、次のようなものを追加することで NPE を明示的にスローすることもできます。メソッドの始まり:

    リーリー

    どの オブジェクトを null にすることができないかをエラー メッセージ内で明示的に記述すると役立つことに注意してください。これを検証する利点は、1) 独自のより明確なエラー メッセージを返せること、2) メソッドの残りの部分では、obj が再割り当てされない限り null ではないことがわかり、安全に逆参照できることです。 また、場合によっては、メソッドの目的は渡されたオブジェクトを操作することだけではないため、空のパラメーターが許容される場合もあります。この場合、

    null 引数

    をチェックし、異なる動作を行う必要があります。これについてもドキュメントで説明する必要があります。たとえば、doSomething() は次のように記述できます: リーリー 最後に、

    スタック トレースを使用して例外と原因を特定する方法

    エラー検索機能を備えたソナーは NPE を検出できます。

    ソナーは JVM によって引き起こされるヌル ポインタ例外を動的にキャプチャできます

    Java 14 では、NullPointerException の根本原因を表示する新しい言語機能が追加されました。この言語機能は、2006 年から SAP Business JVM の一部になっています。

    Java 14 における NullPointerException 例外メッセージの例は次のとおりです:

    NullPointerException

    が発生する状況のリスト 以下は、NullPointerException

    が Java 言語仕様で直接言及されているすべての状況です。

    null 参照の インスタンス

    フィールドにアクセス (つまり、取得または設定) します。 (静的フィールドはカウントされません!)
    • null 参照の インスタンス メソッドを呼び出します。 (静的メソッドはカウントされません!)
    • null 値をスローします;
    • 空の配列の要素にアクセスします。 null で同期 -
    • synchronized (someNullReference) { ... }
    • 整数/浮動小数点演算子は、そのオペランドの 1 つがボックス化された null 参照である場合、NullPointerException
    • をスローする可能性があります。
    • ボックス化された値が null の場合、アンボックス化変換により NullPointerException がスローされます。
    • null 参照で super を呼び出すと、
    • NullPointerException
    • がスローされます。混乱している場合は、これは修飾されたスーパークラス コンストラクター呼び出しについて話しています: リーリー
    for (element : iterable)
      ループを使用して、空のコレクション/配列をループします。
    • switch (foo) { ... }
    • (式かステートメントかを問わず)
    • foo

      が空の場合、 NullPointerException をスローする可能性があります。

      foo.new SomeInnerClass()
    • foo

      が null の場合、NullPointerException をスローします。

      name1::name2
    • または
    • primaryExpression::name

      形式のメソッド参照は、次の場合に評価されると NullPointerException name1# をスローします # # または primaryExpression は null と評価されます。 JLS からのコメントには、someStaticMethod は静的であるため、someInstance.someStaticMethod()

      は NPE をスローしないと記載されていますが、

      someInstance::someStaticMethod は依然として NPE をスローします! * JLS は

      間接的に
    • NPE について多くのことを話す可能性もあることにご注意ください。

    返事
    0
  • キャンセル返事