¿Se ejecutará finalmente el código? Hay retorno en el intento, ¿finalmente todavía se ejecuta?
¿Qué está tratando de investigar esta pregunta?
Comprensión profunda del lenguaje Java para evitar escribir código "problemático" durante el desarrollo
Puntos de conocimiento de inspección
Proceso de ejecución de JVM
¿Cómo deben responder los candidatos?
La descripción de finalmente en la documentación oficial de Java es la siguiente:
The `finally` block *always* executes when the `try` block exits.
El significado general es: el contenido en el bloque de código finalmente se ejecutará definitivamente.
También hay una declaración clara en la especificación JVM
If the try clause executes a return, the compiled code does the following:
1. Saves the return value (if any) in a local variable.
2. Executes a jsr to the code for the finally clause.
3. Upon return from the finally clause, returns the value saved in the local variable.
Significa que si hay un retorno en el intento, el valor de retorno en el intento se almacenará en la tabla de variables locales del marco de la pila, luego se ejecutará el bloque de instrucciones finalmente y, finalmente, el valor de retorno se recuperará del tabla de variables locales y devuelta. Además, cuando hay un retorno tanto en try como en finalmente, se ignorará el retorno de try y se utilizará el retorno de finalmente.
Caso especial
En circunstancias normales, el código en finalmente se ejecutará definitivamente, pero si configuramos el subproceso que ejecuta el bloque de código try-catch-finally como un subproceso daemon, o llamamos para finalizar la máquina virtual actual antes de finalmente, finalmente no se System.exit
ejecutará :
try{
System.exit(0);
}catch (Exception e){
}finally {
}
Thread t1 = new Thread(){
@Override
public void run(){
//try-catch-finally
}
};
t1.setDaemon(true);//设置为守护进程
t1.start();
2.8 En el mecanismo de excepción de Java, la diferencia entre excepción Excepción y error Error
¿Qué está tratando de investigar esta pregunta?
Cuando necesite personalizar excepciones durante el desarrollo, ¿debería elegir definir Excption o Error? ¿Qué representa el código escrito que activa Excption o Error?
Puntos de conocimiento de inspección
mecanismo de excepción de Java
¿Cómo deben responder los candidatos?
Throwable
Hay una clase arrojable en Java Throwable
con dos subclases importantes, una es Error y la otra es Excepción.
[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y subirla directamente (img-oCdRO3Fe-1686365970528)(images\abnormal.png)]
Error
Es un error que el programa no puede manejar, lo que indica un problema grave en el programa. Por ejemplo, error de ejecución de la máquina virtual Java (Virtual MachineError), cuando la JVM ya no tiene los recursos de memoria necesarios para continuar con la operación, aparecerá OutOfMemoryError y así sucesivamente. Cuando ocurren estos errores, la JVM generalmente optará por terminar el subproceso. Estos errores no se pueden verificar, están fuera del control y las capacidades de procesamiento del programa, y la mayoría de ellos no pueden ocurrir cuando el programa se está ejecutando.
Exception
Es una excepción que el programa puede manejar. Y Exception se divide en excepción de tiempo de ejecución (RuntimeException) y excepción que no es de tiempo de ejecución.
-
Operación anormal
Excepciones de tiempo de ejecución, también conocidas como excepciones no comprobadas . El llamado no marcado significa que Java no nos dirá que hay una excepción al compilar y verificar, y debe exponerse en tiempo de ejecución, como subíndice fuera de los límites, excepción de puntero nulo, etc.
-
excepción que no es de tiempo de ejecución
Las excepciones que no sean RuntimeException se conocen colectivamente como excepciones que no de tiempo de ejecución , como IOException y SQLException, que son excepciones que deben manejarse ( verificar excepciones ). Si no se manejan (lanzar a la capa superior o intentar capturar), El programa no se puede compilar.