¿Por qué lanzar una intentos de excepción a las cargas de la clase que se extiende Excepción (a pesar de que no se ejecuta), pero no una clase regular

super estrella secreta:

Tengo el siguiente clases.

He compilado manualmente las clases usando javac y corrió la Driverclase.

Más tarde eliminado el entity.classe MyCustomException.classy corrió la aplicación, como a continuación.

El piloto de pruebas de Java

El siguiente error se quejaron de MyCustomExceptionque falta pero no sobre la Entityclase. Por lo tanto, no está claro por qué JRE quejándose de MyCustomExceptionla clase pero no la Entityclase.

De hecho me han quitado código throw new MyCustomException();pero no lo hice de error encuentro sobre Entityla clase.

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

Tenga en cuenta que la SI condición no se ejecuta como estoy pasando argumento de comando como prueba

¿Por qué es una excepción está causando a cargar el MyCustomExceptionque se nunca se ejecutó, pero la JVM no se carga cualquier otra clase regular menos que la condición se cumple, como en este caso Entityla clase aquí. Por favor marque Driver.javaa continuación.

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");
        }
    }
}

introducir descripción de la imagen aquí

Gracias por la ayuda

OhleC:

(Esto es una conjetura, yo soy de ninguna manera un experto en la parte interna de la JVM)

Asumo el error ocurre durante la verificación , cuando la clase cargada se somete a algunas comprobaciones por lo que el tiempo de ejecución puede hacer algunas suposiciones más tarde.

Uno de los cheques es una typecheck de instrucciones de código de bytes. En concreto athrow:

Una instrucción athrow es un tipo seguro si y sólo si la parte superior de la pila de operandos coincide Throwable.

Así que en este punto, el cargador de clase de carga tiene que MyCustomExceptioncomprobar si se extiendeThrowable

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=136812&siteId=1
Recomendado
Clasificación