JavaRush /Java Blog /Random-KO /자바 스택 추적
IvanDurov
레벨 25

자바 스택 추적

Random-KO 그룹에 게시되었습니다
자바 가상 머신(Java Virtual Machine, 이하 JVM)은 코드를 처리하고 메소드를 시작으로 메소드를 차례로 실행한다 main. 다음 메서드에 도달하면 이 메서드가 스택의 맨 위에 있다고 말합니다. 메서드가 완전히 실행되면 스택에서 제거되고 대기열의 다음 메서드로 대체됩니다. 원리를 설명하려면 다음 코드를 입력하세요. 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)");
    }
}
mainmethod , method m1및 method 의 세 가지 방법이 있습니다 m2. 프로그램이 시작되면 메서드는 스택의 맨 위에 위치합니다 main. 메소드 내부에서는 main메소드가 호출됩니다 m1. 호출되면 그는 스택의 맨 위로 점프합니다. 이 메서드는 m1차례로 m2. 이제 메서드가 m2스택의 맨 위로 이동하여 일시적으로 m1. 잠시 이것을 상상해 보십시오 - main위쪽 m1과 위쪽에 m2! 사업을 마치면 m2종료되고 제어권은 다시 로 돌아갑니다 m1. 메서드 m1도 완료되면 스택에서 제거되고 제어권이 다시 메서드에 부여됩니다 main. 프로그램을 실행하고 출력 창을 보십시오. Main 메소드가 성공적으로 실행됩니다. 첫 번째 메소드는 hello!(m1)라고 말합니다. 두 번째 메소드는 hello(m2)라고 말합니다. Main 메소드가 종료됩니다 . 메소드에서 문제가 발생하면 m2JVM(Java Virtual Machine)이 종료됩니다. ), 기억하시나요?)는 블록과 같은 오류 처리기를 찾습니다 try … catch. 오류 처리기 메서드 에 오류가 없으면 처리할 수 있기를 바라면서 m1예외가 메서드에 전달됩니다 . m1여기서 오류 핸들러를 감지하지 못하면 예외는 다시 스택 위로 이동하며 이번에는 method 로 이동합니다 main. 메소드가 main예외를 포착하지 못하면 출력 창에 이상한 오류 메시지가 인쇄됩니다. 예를 들어, 메서드를 m2다음과 같이 만드세요.
static void m2() {
    int x = 10;
    int y = 0;
    double z = x / y;
    System.out.println( z );
    System.out.println("Method Two - m2");
}
이 방법에는 0으로 나누기 오류가 있습니다. 다음은 프로그램의 정식 버전입니다. 직접 확인해보세요.
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");
    }
}
프로그램을 실행하고 출력 창에 표시되는 내용을 확인하십시오. Main 메소드가 성공적으로 실행되었습니다. 첫 번째 메소드는 hello!(m1)라고 말합니다. "main" 스레드의 예외 java.lang.ArithmeticException: / by zero at errorhandling.errorChecking.m2(<u >errorChecking.java:17</u>) errorhandling.errorChecking.m1(<u>Solution.java:11</u>), errorhandling.errorChecking.main(<u>>Solution.java:5</u) >) 종료 코드 1로 프로세스가 완료되었습니다. 스택 추적이라는 항목을 보고 있습니다. 파란색 밑줄이 그어진 세 줄은 메소드를 나타내며 다음에서 찾을 수 있습니다. Name_пакета.Name_класса.Name_метода 위에서 첫 번째 줄은 오류가 발생한 메소드입니다 m2. Java는 0으로 나누기 오류를 포착하는 방식으로 처리되도록 보장했습니다 ArithmeticException. m2m1메소드 에는 main오류 핸들러가 없습니다 . 그래서 프로그램은 기본 오류 처리기로 이를 처리했습니다. 방법을 m1다음과 같이 변경하십시오.
try {
    System.out.println("Первый метод передаёт привет!(m1)");
    m2( );
}
catch (ArithmeticException err) {
    System.out.println(err.getMessage());
}
m2이제 메소드를 블록으로 래핑했습니다 try. 부분적으로는 catch스택 추적에서 감지된 예외 유형을 사용합니다 ArithmeticException. 코드를 다시 실행하면 출력 창에 다음이 표시됩니다. Main 메소드가 성공적으로 실행되었습니다. 첫 번째 메소드가 hello!(m1) / by zero라고 말합니다. Main 메소드가 종료 됩니다. 오류 메시지가 " / by zero " 로 인쇄되었습니다 . . 메소드가 m2완전히 실행되지 않았으나 오류가 발생하여 중지되었습니다. 그런 다음 제어권이 다시 이전되었습니다 m1. 이는 블록 자체가 오류를 인식했기 때문에 발생했습니다 catch. JVM은 표준 오류 핸들러를 사용하지 않고 블록의 중괄호 사이에 메시지를 표시했습니다 catch. 프로그램 자체는 중지되지 않았으니 주의하시기 바랍니다. 평소와 같이 컨트롤은 호출된 메서드로 이동 main했습니다 m1. 그리고 메소드의 마지막 줄에 " End Main methodmain "를 표시할 수 있었습니다 . 이것은 매우 중요합니다. 의 어딘가에서 후속 작업을 위해 의 값이 필요한 경우 . 그리고 값이 없으면 프로그램이 예상대로 전혀 작동하지 않을 수 있습니다. 출력 창에서 스택 추적을 볼 때 첫 번째 줄은 문제가 발생한 위치이고 나머지 줄(물론 있는 경우)은 예외가 스택 위로 전파된 위치이며 일반적으로 . homeandlearn.co.uk 번역 감사합니다: Sergei Sysoev, Treefeed... m1mainmain
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION