JavaRush /Blog Java /Random-ES /Excepciones en Java
Roman
Nivel 33

Excepciones en Java

Publicado en el grupo Random-ES
Cuando me encontré con el tema "Excepciones", surgieron muchas preguntas a las que tuve que buscar respuestas en varios rincones de Internet para comprender en detalle cómo funciona todo. Como resultado, he compilado mi propia explicación, que puede ser más comprensible para los principiantes que acaban de encontrar este fenómeno. Excepciones en Java - 1En las computadoras, una interrupción es una señal entrante al procesador de que está ocurriendo un evento que requiere una respuesta inmediata. Una señal de interrupción requiere que el procesador ponga en pausa un programa en ejecución para poder continuar un poco más tarde, es decir, la computadora debe recordar toda la información asociada con la ejecución del programa. Estas interrupciones son temporales, si no fatales. Estas interrupciones pueden ser causadas por el código del programa o por alguna funcionalidad del hardware (por ejemplo, simplemente presionar teclas en el teclado; temporizadores, por ejemplo, para apagar automáticamente la computadora). El número de interrupciones está limitado a un número determinado, integrado en la producción de un procesador en particular, es decir, se asignan "canales" de comunicación especiales para esto, lo que le permite acceder al procesador sin pasar por todos los demás procesos. Las interrupciones también se generan automáticamente cuando ocurre un error en el código del programa en ejecución (por ejemplo, si ocurre una división por cero). Estas interrupciones se denominan tradicionalmente trampas o excepciones . En tales casos, se acostumbra decir: "Se lanzó una excepción", es decir, se activó una excepción o se lanzó (lanzó) una excepción , es decir, una solicitud de interrupción.con la pregunta "¿qué hacer?" enviado al procesador. En ese momento, el procesador deja de funcionar, recordando el punto en el que se detuvo, o más bien el cluster de la siguiente celda, cuya información se debe ejecutar. Se recuerda toda la cadena de instrucciones ejecutadas y NO ejecutadas. Después de lo cual, el procesador lee instrucciones de la memoria para tomar medidas en caso de que se produzca tal error. De acuerdo con esta instrucción, puede ingresar nuevos valores en ciertos grupos, agregar algunas cadenas de acciones o un nuevo ciclo (por ejemplo, un ciclo de retorno o bucle), etc., es decir, dependiendo del error previamente establecido. Se ejecutan las instrucciones de descenso. El sistema informático en sí tiene muchas interrupciones automáticas integradas, que se activan después de un cierto período de tiempo, por ejemplo, para controlar los procesos que se ejecutan en la computadora o ejecutar alarmas configuradas, recopilar señales externas entrantes y varios convertidores de datos. Vale la pena recordar que una gran cantidad de interrupciones, por diversas razones, pueden "colgar" completamente el sistema. Un error en el código del programa provocará automáticamente una interrupción en el procesador, que intentará procesar de acuerdo con las instrucciones establecidas. Pero no todas las interrupciones están diseñadas para manejarlas, o puede producirse un procedimiento que no nos convenga, por ejemplo, simplemente bloqueará la aplicación. Por lo tanto, en programación, es posible organizar su propia interrupción para una determinada sección de código en la que el programador ve potencialmente la posibilidad de un error. En este caso, el error se procesará dentro del programa y no se comunicará con el procesador para recibir instrucciones de procesamiento. La definición de dichos bloques se organiza mediante la creación de un Objeto "Excepción" . Este objeto se crea automáticamente en el bloque try-catch. Se verifica la presencia de un error en el bloque >tryy, si lo hay, el programa pasa al bloque catch, donde se toman acciones para prevenir o nivelar el error. Por ejemplo, si ingresamos Números desde el teclado , que posteriormente hay que sumar y restar, entonces ingresar Letras desde el teclado hará imposible sumarlas con Números (denotaremos la suma de estas dos variables con la letra S). Por lo tanto, como equipo, trydebemos verificar si el número A, que contiene Números, se puede sumar al número B, que contiene Letras (es decir, S = A + B), y si esto no es posible, y es imposible, entonces ciertos Se deben tomar medidas para que los errores NO ocurran y una nueva interrupción con la pregunta "¿qué hacer?" no llegue al procesador. Si no hay ninguna excepción en el programa, su ejecución será interrumpida por el procesador. Si hay una excepción, cuando es "captada" por el comando try, el control pasa al comando catch, que puede establecer una solución alternativa, por ejemplo, no sumaremos estos dos números, sino que estableceremos S = A.
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 } catch (Exception igogo1) {
   S = a;
 }
 return S;
/* cadena “int r = 1;” no se ejecuta porque ocurrió un error y el programa redirige el trabajo directamente al controlador de excepciones (bloque catch*/ Por lo tanto, la presencia de excepciones es una oportunidad para resolver el problema dentro del programa sin lanzarlo al nivel del procesador. El objeto "Excepción", que se crea automáticamente en el bloque trycuando se detecta un error, contiene el valor del tipo de error. Llamémoslo "OurException", para nuestro caso específico con una descripción de nuestro error específico. Los creadores del lenguaje Java crearon de antemano una determinada lista de errores típicos y opciones típicas para corregirlos, es decir, en Java existe una determinada biblioteca de Excepciones a la que podemos recurrir para manejar un error que ha ocurrido, de modo que No escribir el código de procesamiento nosotros mismos y, por lo tanto, lo más probable es que OurException ya haya sido descrita por alguien, por lo que solo necesitamos saber cuál de estas excepciones insertaremos en nuestro programa para manejar el código donde podría ocurrir una falla. Si cometemos un error y seleccionamos una excepción incorrecta de la biblioteca , entonces el controlador no la “capturará”, el error no encontrará una solución dentro del programa y la solicitud se enviará al procesador. Pero hay una manera para los perezosos. Si no conocemos el nombre de la excepción que necesitamos de la biblioteca, entonces podemos tomar la general con el nombre " Excepción ", como en el ejemplo descrito anteriormente. Esta Excepción es capaz de manejar cualquier tipo de error, pero no es capaz de proporcionar información específica sobre el incidente que pudimos registrar. La biblioteca de excepciones escritas previamente consta de excepciones marcadas y no marcadas . Los marcables son aquellos que se pueden corregir sin interrumpir el trabajo del programa, es decir, si intentamos abrir un archivo en una carpeta en la que no existe, el sistema nos avisará, podemos soltar el archivo. en la carpeta deseada y continúe con el programa. Es decir, de hecho, se envió una solicitud de interrupción al procesador , pero sin la pregunta: "¡¿¡¿Buscar qué hacer con este problema?!?!" Enviamos una interrupción, que nosotros mismos detectamos, con una instrucción ya preparada, que el procesador procesó y continuó ejecutando el programa. No marcados están aquellos errores que no se pueden corregir y el programa se cerrará antes de completarse, es decir, se enviará una solicitud de interrupción al procesador., que en cualquier caso interrumpirá la ejecución del programa. El único objetivo al escribir este tipo de excepciones en el programa es permitir que el usuario comprenda lo que sucedió, ya que, al detectar esta interrupción, podemos mostrar un mensaje informativo en la pantalla debido a que el programa se bloqueó. La segunda razón para detectar este tipo de interrupciones es la capacidad de registrarlas en los registros para su posterior análisis (fuiste pirateado, pero al menos sabes dónde). Una consecuencia de la presencia de este tipo de bibliotecas es la necesidad de recordar incluirlas. (Puede encontrar una lista de excepciones con bibliotecas marcadas y no marcadas, por ejemplo, aquí ). Si no sabemos exactamente qué biblioteca incluir o hay varias opciones de error, podemos catchenumerar las excepciones requeridas en varias. El propio sistema seleccionará el controlador correcto si está en la lista. En lugar de una excepción específica, puede escribir una " excepción " general que pueda manejar cualquier tipo de excepción si no se procesó en bloques anteriores.
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 }
catch(NullPointerException blabla2) {
   System.out.println("Exception handling code for the NullPointerException.");
 }
catch (ArithmeticException ex1) {
   S = a;
 }
catch(Exception uups1) {
   System.out.println("Exception occured");
 }
 return S;
Si hay un bloque, tryse crea una excepción automáticamente. Si necesitamos forzar una excepción en algún momento , entonces se utiliza el comando throw. Es decir, creamos un objeto de forma independiente new throw... después de lo cual el programa detiene su trabajo, envía una solicitud de interrupción al procesador y se transfiere a la sección del programa catch, desde donde intenta obtener instrucciones para acciones futuras. Al crear manualmente una excepción , podemos especificar su tipo específico desde la biblioteca:

throw new ArithmeticException("Access denied - You must be at least 18 years old.");
luego el controlador buscará un bloque catchcon esta excepción particular : buscará en todo el programa, en todos los lados catch. Después del throwcomando de manejo de excepciones, NO se ejecutará todo el código restante del programa, excepto el que está en el bloque catch. Si el controlador no se encuentra en el programa, se le hace la pregunta al procesador: "decide por ti mismo qué hacer" e interrumpe el programa. La llamada new throw... se puede realizar tanto dentro >trycomo fuera del bloque (en cualquier parte del programa)
try {
   /* функция o действие, в котором есть сомнения. То есть: «попробуй выполнить это, а если не получится, а, если не получится, запускай режим исключения» */
   throw new CallForException(); /* Назначаем исключение, которое будет работать в случае наличия ошибки в функции, описанной выше. Здесь исключение «CallForException» - берется из библиотеки существующих исключений */
} catch (CallForException ee1) {
   /* Корректируем ошибку, чтобы программа не «отвалилась» o выводим сообщение об ошибке o что-то ещё */
} finally {
   /* этот блок работает всегда независимо от того была ошибка o нет. А если была, то сработало ли решение в catch o нет */
   /* часто используется для подчистки хвостов, например, для закрытия запущенного archivo o базы данных */
   /* в ряде случаев блок catch вообще может быть опущен и оставлен только блок finally и наоборот finally может быть опущен и оставлен только catch */
   /* Не допускается использование этого блока в ряде случаев, например, когда функция System.exit() запущена o другие системные Исключения, типа «отключение электроэнергии» и т.п. */
}

Notificación de excepciones

Los métodos escritos previamente por alguien pueden incluir el lanzamiento de excepciones. Para estar seguro, el programador que escribió el código advirtió a los programadores posteriores que podría ocurrir un error en el método que escribió. Entonces, por ejemplo, el método de creación de archivos que se describe a continuación estipula que al crear un archivo puede ocurrir un error (no hay ningún archivo en la ruta indicada), lo que significa que se necesitará un controlador de errores:
public void createFile(String path, String text) throws IOException {
    FileWriter writer = new FileWriter(path, true);
    writer.write(text);
    writer.close();
}
Pero al mismo tiempo, no existe un controlador en sí, lo que significa que ahora no podremos simplemente llamar al método escrito en nuestro programa en modo normal. Ahora debemos escribir un controlador de errores y llamar a este método en el bloque try:
String filePath = "hello.txt";
String text = "Hello World";

try {
    createFile(filePath, text);
} catch (IOException ex) {
    System.err.println("Error creating file: " + ex);
}

Excepciones nativas

Es posible escribir sus propias excepciones para manejar ciertos errores si las bibliotecas existentes no son suficientes para nosotros. Para hacer esto, simplemente creamos una clase que hereda de la clase Exception
public class StudentNotFoundException extends Exception {

    public StudentNotFoundException (String message) {
        super(message);
    }
}
Hay dos reglas a tener en cuenta al crear sus propias excepciones:
  1. El nombre de nuestra clase debe terminar con "Excepción"
  2. La clase debe contener un constructor con una variable de cadena que describa los detalles del problema de excepción. En el constructor, se llama al superconstructor y se pasa un mensaje.
Un ejemplo de uso de la excepción generada:
public class StudentManager {
    public Student find(String studentID) throws StudentNotFoundException {
        if (studentID.equals("123456")) {
            return new Student();
        } else {
            throw new StudentNotFoundException(
                "Could not find student with ID " + studentID);
        }
    }
}
Detectamos esta excepción con el código:
public class StudentTest {
    public static void main(String[] args) {
        StudentManager manager = new StudentManager();
         try {
            Student student = manager.find("0000001");
        } catch (StudentNotFoundException ex) {
            System.err.print(ex);
        }
    }
}
El resultado de ejecutar el programa será: StudentNotFoundException: No se pudo encontrar el estudiante con ID 0000001

¿Por qué necesitas escribir excepciones?

En 1996, el cohete Ariane 5 se estrelló debido a una conversión incorrecta de una variable flotante a una variable entera. No hubo excepciones ni controladores para esta situación. Si durante la descarga de un archivo se pierde la conexión a Internet, entonces la presencia de una Excepción le permitirá continuar con la descarga después de que se restablezca la conexión. Si no hay ninguna excepción, la descarga deberá comenzar de nuevo.

Referencias:

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION