¿Cómo aprender métodos y técnicas de programación Java?
Este artículo presenta principalmente algunos conceptos del mecanismo de excepción de Java. El propósito de escribir este artículo es ayudarme a recordar rápidamente estas cosas cuando las olvido durante mucho tiempo.
1. Mecanismo de excepción
1.1
El mecanismo de excepción se refiere a cómo el programa maneja los errores cuando ocurren. Específicamente, el mecanismo de excepción proporciona una forma segura de salir del programa. Cuando ocurre un error, el flujo de ejecución del programa cambiará y el control del programa se transferirá al controlador de excepciones.
1.2
El método tradicional para manejar excepciones es que la función devuelve un resultado especial para indicar que ha ocurrido una excepción (generalmente este resultado especial es el resultado acordado) y el programa llamar a la función es responsable de verificar los resultados devueltos por la función de análisis. Esto tiene las siguientes desventajas: por ejemplo, una función que devuelve -1 indica una excepción, pero si la función devuelve el valor correcto -1, se reducirá la legibilidad y el código del programa se mezclará con el código que lo maneja; la excepción: la función de llamada Errores de análisis del programa, que requieren que los programadores del cliente tengan un conocimiento profundo de las funciones de la biblioteca.
1.3 Proceso de manejo de excepciones
1.3.1 Cuando se encuentra un error, el método finaliza inmediatamente sin devolver un valor y se lanza un objeto de excepción al mismo tiempo.
1.3.2 El programa que llama al método no continúa ejecutándose, sino que busca el controlador de excepciones que maneja la excepción y ejecuta el código allí
2 Clasificación de excepciones
2.1 Clasificación de excepciones
2.1.1
Estructura de herencia de excepciones: la clase base es Throwable, Error y Exception heredan de Throwable, RuntimeException e IOException heredan de Exception, y la RuntimeException específica hereda de RuntimeException.
2.1.2
Error y RuntimeException y sus subclases se convierten en excepciones no verificadas, y otras excepciones se convierten en excepciones verificadas.
2.2 Características de varios tipos de excepciones
2.2.1 Sistema de errores
El sistema de clases Error describe errores internos y agotamiento de recursos en el sistema de ejecución de Java. Las aplicaciones no deben generar este tipo de objetos (generalmente generados por máquinas virtuales). Si se produce tal error, no queda más remedio que intentar salir del programa de forma segura. Por lo tanto, se debe prestar más atención a los sistemas de excepción al programar.
2.2.2 Sistema de excepciones
El sistema de excepciones consta del sistema RuntimeException y otros sistemas que no pertenecen a RuntimeException
2.2.2.1 RuntimeException
Los sistemas RuntimeException incluyen conversiones de tipos incorrectas, accesos fuera de límites a matrices e intentos de acceder a punteros nulos. El principio de manejo de RuntimeException es que si ocurre una RuntimeException, debe ser un error del programador. Por ejemplo, puede evitar excepciones de acceso fuera de límites de la matriz verificando los subíndices y los límites de la matriz.
2.2.2.2 Otras (IOException, etc.)
Estas excepciones suelen ser errores externos, como intentar leer datos del final del archivo. Esto no es un error en el programa en sí, sino un error externo que ocurre en el entorno de la aplicación.
2.3 Diferencias con la clasificación de excepciones de C++
2.3.1
De hecho, el nombre de clase RuntimeException en Java es inapropiado, porque cualquier excepción es anormal en tiempo de ejecución. (Los errores que ocurren durante la compilación no son excepciones; en otras palabras, el propósito de las excepciones es resolver errores que ocurren mientras el programa se está ejecutando).
2.3.2
Logic_error en C++ es equivalente a una excepción de tiempo de ejecución (RuntimeException) en Java, y el error de tiempo de ejecución (runtime_error) es equivalente a una excepción de tiempo de ejecución sin excepción. tipo.
3 Uso de excepciones
3.1 Declarar métodos para lanzar excepciones
3.1.1 Sintaxis: throws (omitido)
3.1.2 ¿Por qué declarar un método para generar una excepción?
Si un método arroja una excepción es tan importante como el tipo de valor de retorno del método. Supongamos que un método arroja una excepción y no hay ninguna declaración de que arrojará una excepción. El programador del cliente puede llamar al método sin escribir código para manejar la excepción. Entonces, si se produce una excepción, no existe un controlador de excepciones adecuado para manejarla.
3.1.3 ¿Por qué la excepción lanzada debe ser una excepción marcada?
RuntimeException y Error se pueden generar en cualquier código, se lanzarán sin que el programador lo muestre. Una vez que ocurra un error, se lanzará la excepción correspondiente automáticamente. Los programadores lanzan excepciones marcadas, que se dividen en dos situaciones: el programador del cliente llama a una función de biblioteca que genera una excepción (las excepciones de la función de biblioteca las lanza el programador de la biblioteca él mismo usa la declaración throw para generar una excepción); Cuando se encuentra un error, el programador generalmente no puede hacer nada; cuando se encuentra una excepción RuntimeException, debe haber un error lógico en el programa y el programa debe modificarse (este método es equivalente a depurar, solo las excepciones verificadas son el programa); Lo que preocupa al programador es que los programas solo deben y pueden lanzar o manejar excepciones marcadas.
3.1.4
Nota: Un método de subclase que anula un método principal no puede generar más excepciones que el método principal, por lo que a veces el método principal está diseñado para generar excepciones, pero el real El código que implementa este método no genera una excepción. Esto es para facilitar que el método de la subclase anule el método principal y genere una excepción.
3.2 Cómo lanzar excepciones
3.2.1 Sintaxis: throw (omitido)
3.2.2 ¿Qué tipo de excepciones se lanzan?
Para los objetos de excepción, la información realmente útil es el tipo del objeto de excepción, y el tipo en sí no tiene sentido. Por ejemplo, si el tipo de objeto de excepción es ClassCastException, entonces el nombre de la clase es la única información útil. Por lo tanto, al elegir qué excepción lanzar, la clave es elegir una clase con un nombre que describa claramente la excepción.
3.2.3
Los objetos de excepción generalmente tienen dos constructores: uno es un constructor sin parámetros y el otro es un constructor con una cadena. La cadena servirá como una descripción adicional de. el objeto de excepción más allá del nombre del tipo.
3.2.4
Cree sus propias excepciones: cuando ninguna de las excepciones integradas de Java se puede describir claramente, debe crear sus propias excepciones. Tenga en cuenta que la única información útil es el nombre del tipo, así que no gaste esfuerzos en el diseño de la clase de excepción.
3.3 Detectar excepciones
Si no se maneja la excepción, el programa finalizará, los programas de interfaz de usuario no gráfica generarán mensajes de excepción y los programas de interfaz gráfica de usuario generarán mensajes de excepción , pero el programa no abortará y regresará con la GUI. El programa finalizará y se generará un mensaje de excepción. BR> 3.3.1 Sintaxis: try, catch y finalmente (omitido)
Los módulos del controlador deben seguir inmediatamente al bloque try. Si ocurre una excepción, el mecanismo de control de excepciones busca un controlador cuyo primer argumento coincida con el tipo de excepción. Luego ingresa la cláusula catch
y considera que la excepción está controlada. Una vez que finaliza la cláusula catch, la búsqueda del controlador se detiene.
3.3.1.1 Detectar múltiples excepciones (preste atención a la sintaxis y el orden de captura) (omitido)
3.3.1.2 El uso de finalmente y el proceso de manejo de excepciones (omitido)
3.3.2 ¿Cuál es la función del manejo de excepciones?
Para Java, debido a la existencia de recolección de basura, el manejo de excepciones no necesita recuperar memoria. Pero los programadores aún necesitan recopilar algunos recursos, como archivos, conexiones de red e imágenes.
3.3.3 ¿Se debe declarar un método para generar una excepción o la excepción debe quedar atrapada en el método?
Principio: detectar y manejar excepciones que sabes manejar y pasar excepciones que no sabes manejar
3.3.4 Lanzar excepciones nuevamente
3.3 .4.1 ¿Por qué volver a lanzar la excepción?
Solo se puede procesar una parte del contenido procesado en este nivel y parte del procesamiento debe completarse en niveles superiores del entorno, por lo que la excepción debe lanzarse nuevamente. De esta manera, cada nivel de controlador de excepciones puede manejar las excepciones que puede manejar.
3.3.4.2 Flujo de manejo de excepciones
Los bloques de captura correspondientes al mismo bloque de prueba se ignorarán y la excepción lanzada ingresará a un nivel superior.
4 Otros problemas con las excepciones
4.1 Uso excesivo de excepciones
En primer lugar, el uso de excepciones es tan conveniente que los programadores generalmente ya no están dispuestos a escribir código que maneja errores, en lugar de simplemente lanzar una excepción. Esto es incorrecto; para errores totalmente conocidos, se debe escribir código para manejar dichos errores, haciendo así que el programa sea más robusto. Además, el mecanismo de excepción es muy ineficiente.
4.2 Distinguir excepciones de errores ordinarios
Para errores ordinarios idénticos, se debe escribir código para manejar dichos errores, mejorando así la solidez del programa. Las excepciones solo son necesarias para errores de tiempo de ejecución externos que no se pueden determinar ni predecir.
4.3 Información contenida en los objetos de excepción
En términos generales, la única información útil en los objetos de excepción es la información de tipo. Sin embargo, cuando se utiliza un constructor con una cadena de excepción, la cadena se puede utilizar como información adicional. Llamar al método getMessage(), toString() o printStackTrace() del objeto de excepción puede obtener información adicional, nombre de clase e información de la pila de llamadas del objeto de excepción, respectivamente. La información contenida en este último es un superconjunto de la primera.