web-dev-qa-db-ja.com

IncompatibleClassChangeErrorがスローされると、Javaインタプリタレベルで何が起こりますか?

私はJVM内部の初心者です。

IncompatibleClassChangeErrorがスローされたときにJavaインタプリタレベルで何が起こるかを誰かが説明できますか?

ここで説明されているのと同様の問題に直面しています: https://bugs.openjdk.Java.net/browse/JDK-4171827 しかし、このコメントを理解するのに苦労しています(同じページから引用) )::

これは実際には、インタプリタによるIncompatibleClassChangeErrorの処理のバグです。バグは、nullオブジェクトでメソッドの呼び出しをチェックするロジックが実行され、結果としてNullPointerExceptionが発生し、IncompatibleClassChangeErrorをチェックするロジックの前に実行されることです。非静的メソッドが静的になる場合、これにより、インタープリターは、有効であることが保証されていないスタックの値を読み取ることになります。このテストケースでは、有効な値が含まれている場合と含まれていない場合があるスタックの最上位の1つ上の値を読み取ります。テストを少し変更していくつかのnullをプッシュし、呼び出しを行う前にそれらをポップすると、JavaSoftが出荷したすべてのVMでテストが失敗します。これが変更されたテストです...

3
xerocool

この問題は修正されていませんが、再現不可能なものとしてクローズされていると言えます。

はい、しかし私はまだこの行を理解できませんでした:「非静的メソッドが静的になると、インタプリタは有効であることが保証されていないスタックの値を読み取ることになります。」

最も可能性の高いポイントは、staticメソッドの場合、スタックの最上位セルが無視されるメソッドが呼び出され、null(または未定義の値)が含まれる場合。 non-staticメソッドの場合、一番上のセルにはthis参照が含まれます。

IncompatibleClassChangeErrorがスローされたときにJavaインタプリタレベルで何が起こるかを誰かが説明できますか?

answer。 を参照してください

1
Anton Danilov