JavaRush /Blog Java /Random-ES /Seguimiento de la pila de Java
IvanDurov
Nivel 25

Seguimiento de la pila de Java

Publicado en el grupo Random-ES
La Máquina Virtual Java (en adelante JVM) procesa el código y ejecuta los métodos uno tras otro, comenzando con el método main. Cuando llega al siguiente método, dice que este método está en la parte superior de la pila. Una vez que un método se ejecuta por completo, se elimina de la pila y se reemplaza por el siguiente en la cola. Para demostrar el principio, escriba este código: Seguimiento de la pila de Java - 1
package errorhandling;

public class errorChecking {
    public static void main(String[] args) {
        System.out.println("Метод Main успешно запущен");
        m1();
        System.out.println("Метод Main заканчивает свою работу");
    }

    static void m1() {
        System.out.println("Первый метод передаёт привет!(m1)");
        m2();
    }

    static void m2() {
        System.out.println("Второй метод передаёт привет(m2)");
    }
}
Tenemos tres métodos: método main, método m1y método m2. Cuando se inicia el programa, el método se ubica en la parte superior de la pila main. Dentro del método main, se llama al método m1. Cuando se le llama, salta a la cima de la pila. El método m1a su vez llama al m2. Ahora el método m2salta a la parte superior de la pila, eliminando temporalmente m1. Imagínese esto por un segundo: ¡ mainarriba m1y arriba m2! Una vez hecho su trabajo, m2finaliza y el control vuelve a m1. El método m1, cuando se completa, también se elimina de la pila y se le da nuevamente el control main. Ejecute su programa y mire la ventana de resultados: El método principal se ejecuta correctamente. El primer método dice ¡hola!(m1) El segundo método dice hola(m2) El método principal sale. Si algo sale mal en el método m2, la JVM (máquina virtual Java ), lo recuerdas, ¿verdad?) buscará controladores de errores, por ejemplo un bloque try … catch. Si no hay errores en el m1método del controlador de errores, entonces la excepción se pasará al método m1, con la esperanza de que pueda manejarla. Si no detecta un controlador de errores aquí, la excepción volverá a subir en la pila, esta vez al método main. Si el método mainno detecta la excepción, aparecerá un mensaje de error extraño impreso en la ventana de salida. Como ejemplo, haga que su método m2se vea así:
static void m2() {
    int x = 10;
    int y = 0;
    double z = x / y;
    System.out.println( z );
    System.out.println("Method Two - m2");
}
Este método contiene un error de división por cero. Aquí tienes la versión completa del programa, consulta con el tuyo:
package errorhandling;

public class errorChecking {
    public static void main(String[] args) {
        System.out.println("Метод Main успешно запущен");
        m1();
        System.out.println("Метод Main заканчивает свою работу");
    }

    static void m1() {
        System.out.println("Первый метод передаёт привет!(m1)");
        m2();
    }

    static void m2() {
        int x = 10;
        int y = 0;
        double z = x / y;
        System.out.println( z );
        System.out.println("Method Two - m2");
    }
}
Ejecute el programa y vea lo que le ofrece la ventana de salida: El método principal se ejecutó exitosamente. El primer método dice ¡hola!(m1) Excepción en el hilo "principal" java.lang.ArithmeticException: / por cero en errorhandling.errorChecking.m2(<u >errorChecking.java:17</u>) en errorhandling.errorChecking.m1(<u>Solution.java:11</u>) en errorhandling.errorChecking.main(<u>>Solution.java:5</u >) Proceso finalizado con el código de salida 1. Estás viendo algo llamado seguimiento de pila. Las tres líneas subrayadas en azul se refieren a sus métodos y se pueden encontrar en: Nombre_пакета.Nombre_класса.Nombre_метода La primera línea desde arriba es donde ocurrió el error: en el método m2. Java se aseguró de que se manejara de una manera ArithmeticExceptionque detectara los errores de división por cero. No hay ningún controlador de errores en los m2métodos m1y . mainEntonces el programa lo procesó con el controlador de errores predeterminado. Cambie su método m1al siguiente:
try {
    System.out.println("Первый метод передаёт привет!(m1)");
    m2( );
}
catch (ArithmeticException err) {
    System.out.println(err.getMessage());
}
Ahora hemos envuelto el método m2en un bloque try. En parte catch, utilizamos el tipo de excepción que se detectó en el seguimiento de la pila: ArithmeticException. Ejecute el código nuevamente y verá lo siguiente en la ventana de resultados: El método principal se ejecutó exitosamente. El primer método dice ¡hola!(m1) / por cero. El método principal sale. Observe que el mensaje de error se imprimió como: " / por cero " . . El método m2no se ejecutó por completo, pero se detuvo cuando ocurrió un error. Luego se devolvió el control m1. Esto sucedió debido al hecho de que el catchpropio bloque reconoció el error; la JVM no recurrió al controlador de errores estándar, sino que mostró un mensaje ubicado entre las llaves del bloque catch. Tenga en cuenta que el programa en sí no se ha detenido. El control, como es habitual, pasó al método maindesde el que m1fue llamado. Y la última línea del método mainpudo mostrar " Fin del método principal ". Esto es muy, muy importante. Si necesitaba el valor de m1, para trabajos posteriores en algún lugar de main. Y si el valor no está ahí, es posible que su programa no funcione como esperaba. Cuando vea el seguimiento de la pila en la ventana de salida, sepa que la primera línea es donde ocurrió el problema y las líneas restantes (si las hay, por supuesto) son donde se propagó la excepción a la pila, generalmente terminando con el archivo main. Traducción de homeandlearn.co.uk Damos las gracias a: Sergei Sysoev, Treefeed...
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION