¿Cuáles son las principales diferencias entre errores y excepciones en Java?
1. Como se muestra en la figura, tanto la excepción como el error heredan de la clase Throwable. Por la descripción de esta clase en el documento jdk api, podemos saber que es el tipo de componente básico de la excepción. mecanismo de manipulación. Puede ser lanzado por la máquina virtual o por el codificador (throw)
jdk8 Descripción de traducción al chino de la clase Throwable: La clase Throwable es la clase Throwable para todos los errores y excepciones en el lenguaje Java. Sólo los objetos que son instancias de esta clase (o una de sus subclases) son lanzados por la máquina virtual Java o pueden ser lanzados por la declaración de lanzamiento de Java. De manera similar, solo esta clase o sus subclases pueden ser el tipo de parámetro en la cláusula catch.
2.Excepción y Error reflejan la clasificación de los diseñadores de la plataforma Java de diferentes situaciones de excepción. Una excepción es una situación inesperada que se puede esperar durante el funcionamiento normal del programa. Puede y debe detectarse y manejarse en consecuencia.
3. El error se refiere a una situación que es poco probable que ocurra en circunstancias normales. La mayoría de los errores harán que el programa (como la propia JVM) se encuentre en un estado anormal e irrecuperable. Dado que es una situación anormal, es inconveniente y no es necesario capturarlos. Los comunes como OutOfMemoryError son todas subclases de Error.
4.La excepción se divide en excepciones marcadas y excepciones no marcadas que deben capturarse explícitamente en el código fuente, que es parte de la verificación en tiempo de compilación. El error no verificable que presenté anteriormente es arrojable, no excepción.
¿Cómo manejar estas excepciones?
En la programación del mundo real, generalmente utilizamos prueba con recursos y captura múltiple para el manejo de algunas excepciones (características convenientes durante la compilación, la lógica de procesamiento correspondiente se generará automáticamente, por ejemplo, siguiendo automáticamente). Las convenciones cierran objetos que extienden AutoCloseable o Closeable.
try-with-resources es una forma de lidiar con el cierre de recursos de las clases de implementación Closeable. Después de simplemente escribir un ejemplo, puede encontrar que en realidad es una sintaxis que se puede compilar automáticamente para ayudar a compilar. y finalmente cierre las operaciones de transmisión:
public static void main(String[] args) {
try (BufferedReader br = new BufferedReader(new FileReader("a"));
Escritor BufferedWriter = nuevo BufferedWriter(new FileWriter("a"))) {
// Prueba-con-recursos
} catch (IOException e) { // Captura múltiple
// Manejarlo
}
}
Clase compilada
public static void main( String[] args) { prueba {
BufferedReader br = new BufferedReader(new FileReader("a"));
Throwable var2 = null; prueba {
Escritor BufferedWriter = nuevo BufferedWriter(new FileWriter("a"));
Objeto var4 = null; if (writer != null) { if (var4 != null) { try { p>
writer.close();
} catch (Throwable var15) {
((Throwable)var4).addSuppressed(var15);
}
} más {
writer.close();
}
}
} captura (Var16 arrojable) {
var2 = var16; lanzar var16;
} finalmente { if (br!= null) { if (var2!= null) { try {
br.close();
} catch (var14 arrojable) {
var2.addSuppressed(var14);
}
} más {
br.close();
}
}
}
} catch (IOException var18) {
}
}
Dos principios básicos del manejo de excepciones
Intente no detectar excepciones comunes como Excepción excepción, pero debe capturar excepciones específicas
Esto se debe a que en el desarrollo y la integración diarios
En nuestro trabajo, a menudo tenemos más oportunidades para leer código que escribir código. La ingeniería de software es un arte de colaboración, por lo que estamos obligados a hacer que nuestro código refleje intuitivamente la mayor cantidad de información posible, y las excepciones generales y similares simplemente ocultan nuestra. objetivo. Además, también debemos asegurarnos de que el programa no detecte excepciones que no queremos detectar. Por ejemplo, es posible que prefiera que RuntimeException se propague en lugar de detectarse.
No te tragues vivas las excepciones. Esto es algo a lo que se debe prestar especial atención al manejar excepciones, ya que puede provocar situaciones extrañas que son muy difíciles de diagnosticar.
Si no lanzamos la excepción o no la enviamos al registro (Logger), el programa puede finalizar de forma incontrolable en el código posterior. Nadie puede determinar fácilmente dónde se produjo la excepción y qué la causó.
Al escribir un programa, puede utilizar la clase Objetos (proporcionada por jdk) o aserciones para determinar problemas de antemano, como el manejo de algunos valores de excepciones de puntero nulo Objetos requireNonNull(. nombre de archivo); en lugar de usarlo más tarde si hay problemas. El sistema genera una excepción, lo que puede no ser intuitivo para encontrar el problema. Es decir: principio de lanzar temprano, capturar tarde
¡Espero que te sea útil! ~