NullPointerException
は、オブジェクトへの參照と同様に、メモリ內(nèi)の任意の場所 (null) への參照を使用しようとしたときに発生する例外です。 null 參照でメソッドを呼び出すか、null 參照を持つフィールドにアクセスしようとすると、NullPointerException
がトリガーされます。これらが最も一般的ですが、他のメソッドも NullPointerException javadoc ページにリストされています。
リーリー
main 內(nèi)の最初の行で、Object
參照 obj
を null
に明示的に設(shè)定します。これは、參照はあるものの、オブジェクトを指していないことを意味します。その後、そのメソッドを呼び出して、參照をオブジェクトを指すものとして処理しようとします。參照が指す場所には実行するコードがないため、NullPointerException
が発生します。
(これは技術(shù)的な質(zhì)問ですが、言及する価値があると思います。null への參照は、無効なメモリ位置を指す C ポインタと同じではありません。null ポインタは、実際にはどこを指すわけでもありません。無効な位置は 1 つだけ異なります。)
Java には主に 2 つのタイプの変數(shù)があります:
プリミティブ: データを含む変數(shù)。元の変數(shù)のデータを操作したい場合は、変數(shù)を直接操作できます。慣例により、プリミティブ型は小文字で始まります。たとえば、int
または char
型の変數(shù)はプリミティブです。
Reference : オブジェクト
のメモリ アドレスを含む変數(shù)、つまり オブジェクト ## を參照する変數(shù)#コード>. 參照変數(shù)によって參照される Object を操作したい場合は、逆參照
する必要があります。逆參照では通常、メソッドまたはフィールドにアクセスするために . を使用するか、配列のインデックスを作成するために [
を使用する必要があります。慣例により、參照型は通常、大文字で始まる型で表されます。たとえば、Object
型の変數(shù)は參照です。
型の プリミティブ
変數(shù)を宣言しますが、初期化はしません。
リーリー
これらの 2 行は、x
x の値を使用して
y > を指定しようとしているため、プログラムをクラッシュさせます。すべてのプリミティブは、操作する前に使用可能な値に初期化する必要があります。
さあ、話は面白くなります。
參照
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
2 行目では、
new キーワードを使用して、タイプ
Integer のオブジェクトをインスタンス化 (または作成) し、參照変數(shù)
num
Integer オブジェクトに。
オブジェクト
を作成する前に
num を逆參照しようとすると、
NullPointerException
num が初期化されていない可能性があります 」と通知しますが、場合によっては、オブジェクトを直接作成しないコードを作成することもあります。
たとえば、次のようなメソッドが考えられます:
リーリー
この場合、オブジェクト
obj は作成されませんが、
doSomething()
リーリー
この場合、obj は
null であり、ステートメント
obj.myMethod()
NullPointerException メソッド ロジックによってスローされる どの オブジェクトを null をチェックし、異なる動(dòng)作を行う必要があります。これについてもドキュメントで説明する必要があります。たとえば、doSomething() は次のように記述できます:
エラー検索機(jī)能を備えたソナーは NPE を検出できます。
Java 14 における NullPointerException 例外メッセージの例は次のとおりです: NullPointerException
が空の場合、 が null の場合、 形式のメソッド參照は、次の場合に評価されると > をスローします。
メソッドが上記のメソッドのように、渡されたオブジェクトに対して何らかの操作を?qū)g行することを目的としている場合、NullPointerException
をスローするのが適切です。これはプログラマのエラーであり、プログラマはデバッグのためにその情報(bào)が必要であるためです。
someStaticMethodNullPointerException
例外に加えて、メソッド パラメーター內(nèi)の null
値をチェックし、次のようなものを追加することで NPE を明示的にスローすることもできます。メソッドの始まり: にすることができないかをエラー メッセージ內(nèi)で明示的に記述すると役立つことに注意してください。これを検証する利點(diǎn)は、1) 獨(dú)自のより明確なエラー メッセージを返せること、2) メソッドの殘りの部分では、obj が再割り當(dāng)てされない限り null ではないことがわかり、安全に逆參照できることです。
また、場合によっては、メソッドの目的は渡されたオブジェクトを操作することだけではないため、空のパラメーターが許容される場合もあります。この場合、
リーリー
最後に、 が発生する狀況のリスト
が Java 言語仕様で直接言及されているすべての狀況です。
以下は、
NullPointerException null 參照の
インスタンス
for (element : iterable)
null で同期 - NullPointerException
NullPointerException
がスローされます。 super
を呼び出すと、
リーリー
ループを使用して、空のコレクション/配列をループします。
NullPointerException
をスローする可能性があります。
NullPointerException
をスローします。
NullPointerException
name1# をスローします # # または primaryExpression
は null と評価されます。
JLS からのコメントには、 は靜的であるため、
someInstance.someStaticMethod()
someInstance::someStaticMethod は依然として NPE をスローします!
* JLS は