亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

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

全員に返信(2)
P粉252116587

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

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

リーリー

main

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

P粉593536104

Java には主に 2 つのタイプの変數(shù)があります:

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

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

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

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

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

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

変數(shù)は

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

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

最初の行では

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

に設(shè)定します。

2 行目では、

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

が割り當(dāng)てられます。

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

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

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

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

リーリー

この場合、

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

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

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

リーリー

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

null 引數(shù)

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

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

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

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

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

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

NullPointerException

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

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

null 參照の インスタンス

フィールドにアクセス (つまり、取得または設(shè)定) します。 (靜的フィールドはカウントされません!)
  • null 參照の インスタンス メソッドを呼び出します。 (靜的メソッドはカウントされません!)
  • null 値をスローします;
  • 空の配列の要素にアクセスします。 null で同期 -
  • synchronized (someNullReference) { ... }
  • 整數(shù)/浮動(dòng)小數(shù)點(diǎn)演算子は、そのオペランドの 1 つがボックス化された null 參照である場合、NullPointerException
  • をスローする可能性があります。
  • ボックス化された値が null の場合、アンボックス化変換により NullPointerException がスローされます。
  • null 參照で super を呼び出すと、
  • NullPointerException
  • がスローされます?;靵yしている場合は、これは修飾されたスーパークラス コンストラクター呼び出しについて話しています: リーリー
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 について多くのことを話す可能性もあることにご注意ください。

最新のダウンロード
詳細(xì)>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート