2016-04-30 6 views
0

NullPointerExceptionをスローするタイミングをJava Virtual Machineはどのように知っていますか? NullPointerExceptionをスローする必要があるかどうかをチェックするオブジェクトがnullの場合、オブジェクトを呼び出すすべてのメソッドの前にチェックしますか?もしそうなら、これは本当に遅くないのですか?JVMはNullPointerExceptionをスローするタイミングをどのように知るのですか

答えて

4

JVMはnullを「検出」するために使用できる2つの方法があります。

  • 明示的にテストできます。これはオーバーヘッドを表しますが、JIT でテストの一部を最適化できます。例えばメソッドがthis上のメソッドを呼び出すと、NPEを与えることはできません。また、givem参照を使用する呼び出しの1つがNPEでなければ、別の呼び出しはNPEを受け付けません。

  • 仮想メモリハードウェアを使用して実装できます。 JVMは、仮想アドレス空間内のページゼロが読み取り不可+書き込み不可能なページにマップされるように調整します。 nullは0と表されているため、Javaコードがnullを逆参照しようとすると、これはJVMに配信される「segfault」信号につながります。 JVMのsegfaultシグナルハンドラはこれをトラップし、コードが実行されている場所を特定し、現在のスレッドのスタックにNPEを作成してスローすることができます。

    これは複雑で高価ですが、NPEは通常のプログラムではまれであるため、問題はありません。

+0

ホットスポットでは、両方のアプローチがタイプ/ヌルネスプロファイリング情報に基づいて使用されます – the8472

0

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

関連する問題