NullPointerException は、オブジェクトへの参照と同様に、メモリ内の任意の場所 (null) への参照を使用しようとしたときに発生する例外です。 null 参照でメソッドを呼び出すか、null 参照を持つフィールドにアクセスしようとすると、NullPointerException がトリガーされます。これらが最も一般的ですが、他のメソッドも NullPointerException javadoc ページにリストされています。
NullPointerException
リーリー
内の最初の行で、Object 参照 obj を null に明示的に設定します。これは、参照はあるものの、オブジェクトを指していないことを意味します。その後、そのメソッドを呼び出して、参照をオブジェクトを指すものとして処理しようとします。参照が指す場所には実行するコードがないため、NullPointerException が発生します。 (これは技術的な質問ですが、言及する価値があると思います。null への参照は、無効なメモリ位置を指す C ポインタと同じではありません。null ポインタは、実際にはどこを指すわけでもありません。無効な位置は 1 つだけ異なります。)
Object
obj
null
Java には主に 2 つのタイプの変数があります:
プリミティブ: データを含む変数。元の変数のデータを操作したい場合は、変数を直接操作できます。慣例により、プリミティブ型は小文字で始まります。たとえば、int または char 型の変数はプリミティブです。
int
char
Reference : オブジェクト のメモリ アドレスを含む変数、つまり オブジェクト ## を参照する変数#コード>. 参照変数によって参照される Object を操作したい場合は、逆参照 する必要があります。逆参照では通常、メソッドまたはフィールドにアクセスするために . を使用するか、配列のインデックスを作成するために [ を使用する必要があります。慣例により、参照型は通常、大文字で始まる型で表されます。たとえば、Object 型の変数は参照です。
オブジェクト
逆参照
[
型の プリミティブ 変数を宣言しますが、初期化はしません。 リーリー これらの 2 行は、x
プリミティブ
x の値を使用して y > を指定しようとしているため、プログラムをクラッシュさせます。すべてのプリミティブは、操作する前に使用可能な値に初期化する必要があります。 さあ、話は面白くなります。 参照
の値を使用して
> を指定しようとしているため、プログラムをクラッシュさせます。すべてのプリミティブは、操作する前に使用可能な値に初期化する必要があります。
さあ、話は面白くなります。
null に設定できます。これは、「何も参照していません」を意味します。この方法で参照変数を明示的に設定すると、参照変数で null 値を取得するか、参照変数が初期化されず、コンパイラがそれを捕捉しません (Java が自動的に変数を次のように設定します)。 # ##ヌル ###)。 明示的または Java 経由で自動的に参照変数を null に設定し、それを 逆参照しようとすると、NullPointerException が発生します。
明示的または Java 経由で自動的に参照変数を null に設定し、それを
NullPointerException (NPE) は通常、変数を宣言したが、オブジェクトを作成せず、変数の内容を使用しようとする前にそれを変数に割り当てなかった場合に発生します。つまり、実際には存在しないものを参照していることになります。 次のコードを使用します: リーリー
次のコードを使用します:
num という名前の変数を宣言していますが、実際にはまだ参照値が含まれていません。何を指したいのかを指定していないため、Java はそれを null
という名前の変数を宣言していますが、実際にはまだ参照値が含まれていません。何を指したいのかを指定していないため、Java はそれを
new キーワードを使用して、タイプ Integer のオブジェクトをインスタンス化 (または作成) し、参照変数 num
キーワードを使用して、タイプ
のオブジェクトをインスタンス化 (または作成) し、参照変数
Integer オブジェクトに。 オブジェクト を作成する前に num を逆参照しようとすると、NullPointerException
オブジェクトに。
を作成する前に
を逆参照しようとすると、
num が初期化されていない可能性があります 」と通知しますが、場合によっては、オブジェクトを直接作成しないコードを作成することもあります。 たとえば、次のようなメソッドが考えられます: リーリー この場合、オブジェクト obj は作成されませんが、doSomething()
」と通知しますが、場合によっては、オブジェクトを直接作成しないコードを作成することもあります。
この場合、オブジェクト
は作成されませんが、
obj は null であり、ステートメント 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()
> をスローします。
メソッド ロジックによってスローされる 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 からのコメントには、
メソッド ロジックによってスローされる NullPointerException 例外に加えて、メソッド パラメーター内の null 値をチェックし、次のようなものを追加することで NPE を明示的にスローすることもできます。メソッドの始まり:
どの オブジェクトを null にすることができないかをエラー メッセージ内で明示的に記述すると役立つことに注意してください。これを検証する利点は、1) 独自のより明確なエラー メッセージを返せること、2) メソッドの残りの部分では、obj が再割り当てされない限り null ではないことがわかり、安全に逆参照できることです。 また、場合によっては、メソッドの目的は渡されたオブジェクトを操作することだけではないため、空のパラメーターが許容される場合もあります。この場合、
にすることができないかをエラー メッセージ内で明示的に記述すると役立つことに注意してください。これを検証する利点は、1) 独自のより明確なエラー メッセージを返せること、2) メソッドの残りの部分では、obj が再割り当てされない限り null ではないことがわかり、安全に逆参照できることです。
をチェックし、異なる動作を行う必要があります。これについてもドキュメントで説明する必要があります。たとえば、doSomething() は次のように記述できます: リーリー 最後に、
エラー検索機能を備えたソナーは NPE を検出できます。
一个>Java 14 では、NullPointerException の根本原因を表示する新しい言語機能が追加されました。この言語機能は、2006 年から SAP Business JVM の一部になっています。
Java 14 における NullPointerException 例外メッセージの例は次のとおりです:
以下は、
null 参照の インスタンス
null 参照の
super
が空の場合、 NullPointerException をスローする可能性があります。
が null の場合、NullPointerException をスローします。
形式のメソッド参照は、次の場合に評価されると NullPointerException name1# をスローします # # または primaryExpression は null と評価されます。 JLS からのコメントには、
primaryExpression
は静的であるため、
someInstance::someStaticMethod は依然として NPE をスローします! * JLS は
は依然として NPE をスローします!
NullPointerException を説明するために私が考えることができる最速のコード例は、おそらく次のとおりです。NullPointerException
は、オブジェクトへの参照と同様に、メモリ内の任意の場所 (null) への参照を使用しようとしたときに発生する例外です。 null 参照でメソッドを呼び出すか、null 参照を持つフィールドにアクセスしようとすると、NullPointerException
がトリガーされます。これらが最も一般的ですが、他のメソッドも NullPointerExceptionjavadoc ページにリストされています。
リーリー
main内の最初の行で、
(これは技術的な質問ですが、言及する価値があると思います。null への参照は、無効なメモリ位置を指す C ポインタと同じではありません。null ポインタは、実際にはどこを指すわけでもありません。無効な位置は 1 つだけ異なります。)
Object
参照obj
をnull
に明示的に設定します。これは、参照はあるものの、オブジェクトを指していないことを意味します。その後、そのメソッドを呼び出して、参照をオブジェクトを指すものとして処理しようとします。参照が指す場所には実行するコードがないため、NullPointerException
が発生します。Java には主に 2 つのタイプの変数があります:
プリミティブ: データを含む変数。元の変数のデータを操作したい場合は、変数を直接操作できます。慣例により、プリミティブ型は小文字で始まります。たとえば、
int
またはchar
型の変数はプリミティブです。Reference :
オブジェクト
のメモリ アドレスを含む変数、つまり オブジェクト ## を参照する変数#コード>. 参照変数によって参照される Object を操作したい場合は、逆参照
する必要があります。逆参照では通常、メソッドまたはフィールドにアクセスするために . を使用するか、配列のインデックスを作成するために[
を使用する必要があります。慣例により、参照型は通常、大文字で始まる型で表されます。たとえば、Object
型の変数は参照です。型の
に値が指定されておらず、プリミティブ
変数を宣言しますが、初期化はしません。 リーリー これらの 2 行は、xx
変数はの値を使用して
y> を指定しようとしているため、プログラムをクラッシュさせます。すべてのプリミティブは、操作する前に使用可能な値に初期化する必要があります。
さあ、話は面白くなります。
参照null に設定できます。これは、「何も参照していません
」を意味します。この方法で参照変数を明示的に設定すると、参照変数で null 値を取得するか、参照変数が初期化されず、コンパイラがそれを捕捉しません (Java が自動的に変数を次のように設定します)。 # ##ヌル ###)。
明示的または Java 経由で自動的に参照変数を null に設定し、それを
逆参照しようとすると、NullPointerException
が発生します。NullPointerException (NPE) は通常、変数を宣言したが、オブジェクトを作成せず、変数の内容を使用しようとする前にそれを変数に割り当てなかった場合に発生します。つまり、実際には存在しないものを参照していることになります。
最初の行では次のコードを使用します:
リーリーnum
に設定します。という名前の変数を宣言していますが、実際にはまだ参照値が含まれていません。何を指したいのかを指定していないため、Java はそれを
nullnew
が割り当てられます。キーワードを使用して、タイプ
Integerのオブジェクトをインスタンス化 (または作成) し、参照変数
numInteger
が発生します。最も単純なケースでは、コンパイラが問題を検出して、「オブジェクトに。
オブジェクト
を作成する前に
numを逆参照しようとすると、
NullPointerExceptionnum が初期化されていない可能性があります
メソッドを呼び出す前にオブジェクトが作成されたものと想定されます。このメソッドは次のように呼び出すことができることに注意してください:」と通知しますが、場合によっては、オブジェクトを直接作成しないコードを作成することもあります。
たとえば、次のようなメソッドが考えられます: リーリーこの場合、オブジェクト
objは作成されませんが、
doSomething()リーリー
この場合、obj
はは
nullであり、ステートメント
obj.myMethod()NullPointerException
は NPE をスローしないと記載されていますが、> をスローします。
メソッドが上記のメソッドのように、渡されたオブジェクトに対して何らかの操作を実行することを目的としている場合、NullPointerException
をスローするのが適切です。これはプログラマのエラーであり、プログラマはデバッグのためにその情報が必要であるためです。
フィールドにアクセス (つまり、取得または設定) します。 (静的フィールドはカウントされません!)- null 参照の インスタンス メソッドを呼び出します。 (静的メソッドはカウントされません!)
- null 値をスローします;
- 空の配列の要素にアクセスします。
null で同期 - synchronized (someNullReference) { ... }-
- 整数/浮動小数点演算子は、そのオペランドの 1 つがボックス化された null 参照である場合、
をスローする可能性があります。
- ボックス化された値が null の場合、アンボックス化変換により
- null 参照で
NullPointerException- がスローされます。混乱している場合は、これは修飾されたスーパークラス コンストラクター呼び出しについて話しています:
リーリー
for (element : iterable)
someStaticMethodメソッド ロジックによってスローされる
リーリーNullPointerException
例外に加えて、メソッド パラメーター内のnull
値をチェックし、次のようなものを追加することで NPE を明示的にスローすることもできます。メソッドの始まり:どの オブジェクトを null
null 引数にすることができないかをエラー メッセージ内で明示的に記述すると役立つことに注意してください。これを検証する利点は、1) 独自のより明確なエラー メッセージを返せること、2) メソッドの残りの部分では、obj が再割り当てされない限り null ではないことがわかり、安全に逆参照できることです。
また、場合によっては、メソッドの目的は渡されたオブジェクトを操作することだけではないため、空のパラメーターが許容される場合もあります。この場合、をチェックし、異なる動作を行う必要があります。これについてもドキュメントで説明する必要があります。たとえば、doSomething() は次のように記述できます:
スタック トレースを使用して例外と原因を特定する方法リーリー
最後に、エラー検索機能を備えたソナーは NPE を検出できます。
ソナーは JVM によって引き起こされるヌル ポインタ例外を動的にキャプチャできます一个>Java 14 では、NullPointerException の根本原因を表示する新しい言語機能が追加されました。この言語機能は、2006 年から SAP Business JVM の一部になっています。
Java 14 における NullPointerException 例外メッセージの例は次のとおりです:
NullPointerException
が発生する状況のリスト
が Java 言語仕様で直接言及されているすべての状況です。以下は、
NullPointerExceptionnull 参照の
インスタンスNullPointerException
NullPointerException
がスローされます。super
を呼び出すと、ループを使用して、空のコレクション/配列をループします。-
switch (foo) { ... } (式かステートメントかを問わず) - foo
- foo
または - primaryExpression::name
が空の場合、
foo.new SomeInnerClass()NullPointerException
をスローする可能性があります。が null の場合、
name1::name2NullPointerException
をスローします。形式のメソッド参照は、次の場合に評価されると
JLS からのコメントには、
NullPointerException
name1# をスローします # # またはprimaryExpression
は null と評価されます。は静的であるため、
someInstance.someStaticMethod()someInstance::someStaticMethod
間接的に NPE について多くのことを話す可能性もあることにご注意ください。は依然として NPE をスローします!
* JLS は