1. ホーム
  2. java

[解決済み] キャッチ不能なChuckNorrisException

2022-03-17 21:43:20

質問

でコードのスニペットを構成することは可能でしょうか? Java を作るような仮想的な java.lang.ChuckNorrisException アンキャッチャブル?

思いついたのは、例えばインターセプターを使うか、あるいは アスペクト指向プログラミング .

解決方法は?

試していないのでわかりませんが、このように JVM を投げるようなコードをコンパイルすることができるかもしれません。 ChuckNorrisException のクラス定義を提供し、実行時に ChuckNorrisException どの を拡張していない。 .

UPDATEしています。

うまくいきません。ベリファイアエラーが発生します。

Exception in thread "main" java.lang.VerifyError: (class: TestThrow, method: ma\
in signature: ([Ljava/lang/String;)V) Can only throw Throwable objects
Could not find the main class: TestThrow.  Program will exit.

UPDATE 2:

実は、バイトコードベリファイアを無効にすると、これが使えるようになるんです! ( -Xverify:none )

UPDATE 3:

自宅からフォローする人のために、ここに完全なスクリプトがあります。

以下のクラスを作成します。

public class ChuckNorrisException
    extends RuntimeException // <- Comment out this line on second compilation
{
    public ChuckNorrisException() { }
}

public class TestVillain {
    public static void main(String[] args) {
        try {
            throw new ChuckNorrisException();
        }
        catch(Throwable t) {
            System.out.println("Gotcha!");
        }
        finally {
            System.out.println("The end.");
        }
    }
}

クラスをコンパイルします。

javac -cp . TestVillain.java ChuckNorrisException.java

実行します。

java -cp . TestVillain
Gotcha!
The end.

コメントアウト "extendsRuntimeException"および リコンパイル ChuckNorrisException.java のみ :

javac -cp . ChuckNorrisException.java

実行します。

java -cp . TestVillain
Exception in thread "main" java.lang.VerifyError: (class: TestVillain, method: main signature: ([Ljava/lang/String;)V) Can only throw Throwable objects
Could not find the main class: TestVillain.  Program will exit.

検証を行わずに実行する。

java -Xverify:none -cp . TestVillain
The end.
Exception in thread "main"