자바 가상 머신(Java Virtual Machine, 이하 JVM)은 코드를 처리하고 메소드를 시작으로 메소드를 차례로 실행한다
main
. 다음 메서드에 도달하면 이 메서드가 스택의 맨 위에 있다고 말합니다. 메서드가 완전히 실행되면 스택에서 제거되고 대기열의 다음 메서드로 대체됩니다. 원리를 설명하려면 다음 코드를 입력하세요.
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)");
}
}
main
method , method m1
및 method 의 세 가지 방법이 있습니다 m2
. 프로그램이 시작되면 메서드는 스택의 맨 위에 위치합니다 main
. 메소드 내부에서는 main
메소드가 호출됩니다 m1
. 호출되면 그는 스택의 맨 위로 점프합니다. 이 메서드는 m1
차례로 m2
. 이제 메서드가 m2
스택의 맨 위로 이동하여 일시적으로 m1
. 잠시 이것을 상상해 보십시오 - main
위쪽 m1
과 위쪽에 m2
! 사업을 마치면 m2
종료되고 제어권은 다시 로 돌아갑니다 m1
. 메서드 m1
도 완료되면 스택에서 제거되고 제어권이 다시 메서드에 부여됩니다 main
. 프로그램을 실행하고 출력 창을 보십시오. Main 메소드가 성공적으로 실행됩니다. 첫 번째 메소드는 hello!(m1)라고 말합니다. 두 번째 메소드는 hello(m2)라고 말합니다. Main 메소드가 종료됩니다 . 메소드에서 문제가 발생하면 m2
JVM(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
. m2
및 m1
메소드 에는 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... m1
main
main
GO TO FULL VERSION