NullPointerExceptionをスローするタイミングをJava Virtual Machineはどのように知っていますか? NullPointerExceptionをスローする必要があるかどうかをチェックするオブジェクトがnullの場合、オブジェクトを呼び出すすべてのメソッドの前にチェックしますか?もしそうなら、これは本当に遅くないのですか?JVMはNullPointerExceptionをスローするタイミングをどのように知るのですか
答えて
JVMはnullを「検出」するために使用できる2つの方法があります。
明示的にテストできます。これはオーバーヘッドを表しますが、JIT はでテストの一部を最適化できます。例えばメソッドが
this
上のメソッドを呼び出すと、NPEを与えることはできません。また、givem参照を使用する呼び出しの1つがNPEでなければ、別の呼び出しはNPEを受け付けません。仮想メモリハードウェアを使用して実装できます。 JVMは、仮想アドレス空間内のページゼロが読み取り不可+書き込み不可能なページにマップされるように調整します。
null
は0と表されているため、Javaコードがnull
を逆参照しようとすると、これはJVMに配信される「segfault」信号につながります。 JVMのsegfaultシグナルハンドラはこれをトラップし、コードが実行されている場所を特定し、現在のスレッドのスタックにNPEを作成してスローすることができます。これは複雑で高価ですが、NPEは通常のプログラムではまれであるため、問題はありません。
NULLPointerExceptionは基本的にランタイム例外です。つまり、JVMは、操作を実行しているときに実際のオブジェクトが参照されることを期待しています。
これをよりよく理解するには、java.Hereで作成および参照されるオブジェクトの構文を知る必要があります。 myClass o = new myClass();
この場合、オブジェクトは、そのオブジェクトへの参照としてoを使用してヒープ空間に作成されます。つまり、oは基本的にそのオブジェクトを指しています。実行時に、JVMは、oが指し示す実際のオブジェクトを判断し、それを使用して操作を実行します。
したがって、上記のmyClass定義のインスタンスメソッドとしてdoSomething()メソッドがあり、このo.doSomething()のように呼び出すと、JVMは実際のオブジェクトを見つけてこのメソッドを呼び出します。
しかし、 o = nullを設定すると、 oはmyclassの実際のオブジェクトを指していません。つまり、oは何も指していません。 これで、o.doSomethingの実行中に、JVMはoが何も指していないことを知り、その場合にランタイム例外NULLPointerExceptionをスローします。
実行時に発生する実際に参照されるオブジェクトで動作するように、またプログラムでNULLチェックをproeprly処理せずにJVMによってNULLpointerExceptionがスローされる場合は、JVMが設計されているので、クラッシュし、jvmが終了します。
は、より多くの情報のためのJavaドキュメントを参照してください。 http://docs.oracle.com/javase/7/docs/api/java/lang/NullPointerException.html
- 1. Hibernateはnullpointerexceptionをスローする
- 2. C++でNullPointerExceptionをスローする
- 3. 待機/通知はどのようにJVMレベルで機能しますか?
- 4. ストリーミングビデオの次のフレームを表示するタイミングをデコーダがどのように知っていますか?
- 5. なぜAndroidがNullPointerExceptionをスローするのですか?
- 6. JVMの速度を上げるにはどうすればよいですか?
- 7. ファイルをbackberryからWebサービスにアップロードする= JVMエラー104 Uncaught NullPointerException?
- 8. AndroidでNullPointerExceptionのトラブルシューティングを行うにはどうすればよいですか?
- 9. setOnClickListenerはforループ内でのみNullPointerExceptionをスローします。どうして?
- 10. スマートキャッシュはどのように機能しますか?キャッシュするタイミングをどのように知っていますか?
- 11. どのような例外をスローするのですか?
- 12. Java - EnumSet.add(enum)、NullPointerExceptionをスローする
- 13. Javaアプレット:inetAddress.getHostName()がNullPointerExceptionをスローする
- 14. 私のリストに追加できない、NullPointerExceptionをスローする
- 15. なぜSQLiteQueryBuilderがActivity.onRestart()の後にcomputeProjection()でNullPointerExceptionをスローするのですか?
- 16. JVMがOutOfMemoryErrorをスローするとき
- 17. XMLHttpRequestはコールバックを呼び出すタイミングをどのように知っていますか?
- 18. null.asInstanceOf [Int]がNullPointerExceptionをスローしないのはなぜですか?
- 19. APIに例外をスローする適切なタイミングは何ですか?
- 20. Htmlからどのような例外がスローされるのかを知るには?
- 21. Environment.StackTraceはどのようにArgumentOutOfRangeExceptionをスローすることができますか?
- 22. 例外をスローするメソッドはどのようにインライン化できますか?
- 23. JVM Verifierがクラスを検証するタイミングを示す
- 24. どのようにインポートするのか知るには?
- 25. なぜNullPointerExceptionがスローされるのですか?
- 26. 一部のデバイスでgetMap()がNullPointerExceptionをスローする
- 27. SharedPreferencesのインスタンス化時にAndroidがNullPointerExceptionをスローする
- 28. VHDLからの出力が最終値に達するタイミングを知るには?
- 29. バンドルがosgi実行時に例外をスローすると、どのように通知されますか?
- 30. ユーザーがブラウザでファイルをダウンロードするタイミングを検出するにはどうすればよいですか?
ホットスポットでは、両方のアプローチがタイプ/ヌルネスプロファイリング情報に基づいて使用されます – the8472