P粉2521165872023-08-24 09:14:35
NullPointerException
は、オブジェクトへの参照と同様に、メモリ内の任意の場所 (null) への参照を使用しようとしたときに発生する例外です。 null 参照でメソッドを呼び出すか、null 参照を持つフィールドにアクセスしようとすると、NullPointerException
がトリガーされます。これらが最も一般的ですが、他のメソッドも NullPointerException javadoc ページにリストされています。
リーリー
main 内の最初の行で、Object
参照 obj
を null
に明示的に設定します。これは、参照はあるものの、オブジェクトを指していないことを意味します。その後、そのメソッドを呼び出して、参照をオブジェクトを指すものとして処理しようとします。参照が指す場所には実行するコードがないため、NullPointerException
が発生します。
(これは技術的な質問ですが、言及する価値があると思います。null への参照は、無効なメモリ位置を指す C ポインタと同じではありません。null ポインタは、実際にはどこを指すわけでもありません。無効な位置は 1 つだけ異なります。)
P粉5935361042023-08-24 00:10:48
Java には主に 2 つのタイプの変数があります:
プリミティブ: データを含む変数。元の変数のデータを操作したい場合は、変数を直接操作できます。慣例により、プリミティブ型は小文字で始まります。たとえば、int
または char
型の変数はプリミティブです。
Reference : オブジェクト
のメモリ アドレスを含む変数、つまり オブジェクト ## を参照する変数#コード>. 参照変数によって参照される Object を操作したい場合は、逆参照
する必要があります。逆参照では通常、メソッドまたはフィールドにアクセスするために . を使用するか、配列のインデックスを作成するために [
を使用する必要があります。慣例により、参照型は通常、大文字で始まる型で表されます。たとえば、Object
型の変数は参照です。
型の プリミティブ
変数を宣言しますが、初期化はしません。
リーリー
これらの 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()
リーリー
この場合、obj は
null であり、ステートメント
obj.myMethod()
NullPointerException メソッド ロジックによってスローされる どの オブジェクトを null をチェックし、異なる動作を行う必要があります。これについてもドキュメントで説明する必要があります。たとえば、doSomething() は次のように記述できます: Java 14 における NullPointerException 例外メッセージの例は次のとおりです: NullPointerException
が空の場合、 が null の場合、 形式のメソッド参照は、次の場合に評価されると > をスローします。
メソッドが上記のメソッドのように、渡されたオブジェクトに対して何らかの操作を実行することを目的としている場合、NullPointerException
をスローするのが適切です。これはプログラマのエラーであり、プログラマはデバッグのためにその情報が必要であるためです。
someStaticMethodNullPointerException
例外に加えて、メソッド パラメーター内の null
値をチェックし、次のようなものを追加することで NPE を明示的にスローすることもできます。メソッドの始まり: にすることができないかをエラー メッセージ内で明示的に記述すると役立つことに注意してください。これを検証する利点は、1) 独自のより明確なエラー メッセージを返せること、2) メソッドの残りの部分では、obj が再割り当てされない限り null ではないことがわかり、安全に逆参照できることです。
また、場合によっては、メソッドの目的は渡されたオブジェクトを操作することだけではないため、空のパラメーターが許容される場合もあります。この場合、
リーリー
最後に、 が発生する状況のリスト
が Java 言語仕様で直接言及されているすべての状況です。
以下は、
NullPointerException null 参照の
インスタンス
for (element : iterable)
null で同期 - NullPointerException
NullPointerException
がスローされます。 super
を呼び出すと、
リーリー
ループを使用して、空のコレクション/配列をループします。
NullPointerException
をスローする可能性があります。
NullPointerException
をスローします。
NullPointerException
name1# をスローします # # または primaryExpression
は null と評価されます。
JLS からのコメントには、 は静的であるため、
someInstance.someStaticMethod()
someInstance::someStaticMethod は依然として NPE をスローします!
* JLS は