なぜ負荷に例外試行をスロー例外を拡張するクラス(それが実行されないが)ではなく通常のクラス

秘密のスーパースター:

私は以下のクラスがあります。

私は手動で使用してクラスをコンパイルしているのjavacをして走ったDriverクラスを。

その後、削除entity.classしてMyCustomException.class、以下のようなアプリを実行しました。

Javaドライバテスト

エラー以下不満さMyCustomExceptionについては欠けますがされていないEntityクラス。JREが不満なぜ、クリアしないMyCustomExceptionクラスではなくEntityクラス。

確かに私は、コードを削除したthrow new MyCustomException();が、私はついてない出会いエラーをしたEntityクラス。

Caused by: java.lang.NoClassDefFoundError: com/techdisqus/exception/MyCustomException

ので、予めご了承くださいIF条件はなりませする実行私のようにコマンド引数を渡していて、テスト

なぜそれが例外をスローしてロードするために引き起こしているMyCustomException実行されないことになるが、条件が満たされない限り、JVMはこことして、他の定期的なクラスをロードしないEntityクラスここに。ご確認くださいDriver.java以下。

MyCustomException.java

public class MyCustomException extends RuntimeException {

}

Entity.java

public class Entity {
}

Driver.java

public class Driver {


    public static void main(String[] args) {

        String s = args[0];
        if("true".equals(s)){
            Entity entity = new Entity(); // This is not loaded, unless s is true
            throw  new MyCustomException(); // this is loaded even s is NOT true.
        }else{
            System.out.println("success");
        }
    }
}

ここでは、画像の説明を入力します。

手伝ってくれてありがとう

OhleC:

(これは推測であり、私は決してJVMの内部の専門家です)

私はエラーが中に発生したと仮定し、検証、実行時には、後にいくつかの仮定を行うことができますので、ロードされたクラスは、いくつかの健全性チェックを受けたときに、。

チェックの一つは、バイトコード命令のです。TypeCheckです。具体的にathrow

athrow命令のオペランドスタックの最上位はThrowableのと一致した場合に限っ型安全です。

したがって、この時点で、クラスローダがロードする必要がありMyCustomException、それが伸びるかどうかをチェックしますThrowable

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=136809&siteId=1