"안녕하세요, 아미고. 오늘은 매우 흥미로운 수업을 할 것입니다. 예외에 대해 말씀드리겠습니다. 예외는 프로그램 의 오류를 처리할 수 있는 특별한 메커니즘입니다. 발생할 수 있는 오류의 몇 가지 예는 다음과 같습니다. 프로그램에서:

1. 하드 드라이브가 완전히 차면 프로그램이 파일 쓰기를 시도할 수 있습니다.

2. 프로그램이 null 참조를 저장하는 변수에 대한 메서드를 호출하려고 시도할 수 있습니다.

3. 프로그램이 숫자를 0으로 나누려고 할 수 있습니다."

이러한 모든 조치로 인해 오류가 발생합니다. 일반적으로 결과는 프로그램이 즉시 종료되는 것입니다. 이 경우 코드 실행을 계속하는 것은 의미가 없기 때문입니다.

"왜?"

"자동차가 도로를 벗어나 절벽에서 떨어지면 계속 바퀴를 돌리는 것이 이치에 맞습니까?"

"그럼 프로그램 실행을 중지해야 합니까?"

"예. 적어도 이런 일이 있었습니다. 오류가 발생하면 프로그램이 종료되었습니다."

"매우 현명한 접근 방식입니다."

"하지만 프로그램을 계속 실행하는 것이 좋지 않을까요?"

"예. Word에 엄청난 양의 텍스트를 입력하고 저장했다고 가정해 보겠습니다. 저장 작업이 실패했지만 프로그램이 모든 것이 괜찮다고 믿게 한다면 어떻게 하시겠습니까? 그리고 계속 입력하십시오. 그것은 어리석은 일입니다. 그것?"

"네."

"그런 다음 프로그래머는 흥미로운 해결책을 내놓았습니다. 각 함수는 작업 상태를 반환합니다. 0은 예상대로 작동했음을 의미합니다. 다른 값은 일부 오류가 발생했음을 의미하고 반환 값은 오류 코드였습니다."

"그러나 이 접근 방식에도 단점이 있습니다. 모든(!) 함수 호출 후 반환 코드(숫자)를 확인해야 합니다. 우선 이것이 불편합니다. 오류 처리 코드가 거의 실행되지 않지만 포함되어야 합니다. 둘째, 함수는 종종 다른 값을 반환합니다. 이 값으로 무엇을 해야 합니까?"

"맞아. 나도 그 생각했어."

"그러면 예외와 오류 처리 메커니즘의 형태로 밝은 미래가 도래했습니다. 작동 방식은 다음과 같습니다.

1. 오류가 발생하면 Java Machine은 모든 오류 정보를 저장하는 특수 개체(예외)를 생성합니다. 다른 오류에 대한 다른 예외가 있습니다.

2. 예외로 인해 프로그램은 즉시 현재 함수와 다음 함수 등을 종료합니다. 즉, 메인 메서드를 종료할 때까지 계속됩니다. 그런 다음 프로그램이 종료됩니다. 프로그래머는 Java Machine이 '호출 스택을 해제한다'고 말할 수도 있습니다."

"하지만 프로그램이 항상 종료되는 것은 아니라고 하셨습니다."

"그렇습니다. 예외를 포착할 수 있는 방법이 있기 때문입니다. 우리는 우리가 관심을 갖는 예외를 포착하고 그들과 함께 무언가를 하기 위해 올바른 위치에 특별한 코드를 작성할 수 있습니다. 이것은 중요한 것입니다."

"이 작업을 수행하는 데 도움이 되는 특별한 try-catch 구성이 있습니다 . 작동 방식은 다음과 같습니다."

예외(0으로 나누기)를 포착하고 계속 작동하는 프로그램의 예.
public class ExceptionExample2
{
    public static void main(String[] args)
    {
        System.out.println("Program starts");

        try
        {
            System.out.println("Before calling method1");
            method1();
            System.out.println("After calling method1. This will never be shown");
        }
        catch (Exception e)
        {
           System.out.println("Exception has been caught");
        }

        System.out.println("Program is still running");
    }

    public static void method1()
    {
        int a = 100;
        int b = 0;
        System.out.println(a / b);
    }
}
화면 출력:
Program starts
Before method1 calling
Exception has been caught
Program is still running

"그런데 왜 '메소드 1을 호출한 후. 이것은 절대 표시되지 않을 것입니다'가 화면에 표시되지 않습니까?"

"물어주셔서 기쁩니다. 25행에서 0으로 나누면 오류가 발생합니다. 예외입니다. Java Machine은 오류에 대한 정보가 있는 ArithmeticException 객체를 생성합니다. 객체가 예외입니다."

"메서드 내에서 예외가 발생합니다 method1. 이로 인해 메소드가 즉시 종료됩니다. try-catch 블록 이 아닌 경우 기본 메소드가 종료 됩니다 ."

" try 블록 내에서 예외가 발생하면 catch 블록 에서 catch됩니다 . try 블록의 나머지 코드는 실행되지 않습니다. 대신 catch 블록이 실행되기 시작합니다. "

"이해가 안 된다."

"즉, 코드는 다음과 같이 작동합니다.

1. try 블록 내에서 예외가 발생하면 예외가 발생한 곳에서 코드 실행을 멈추고 catch 블록이 실행되기 시작합니다.

2. 예외 가 발생하지 않으면 try 블록이 끝까지 실행되고 catch 블록은 실행되지 않습니다 . "

"뭐?"

"각 메서드 호출 후 메서드가 정상적으로 반환되었는지 또는 예외로 인해 갑자기 종료되었는지 확인한다고 상상해 보십시오. 예외가 있으면 catch 블록(있는 경우)을 실행하여 예외를 catch합니다. catch 블록이 없으면 현재 메서드를 종료하고 우리를 호출한 메서드가 동일한 검사를 수행합니다."

"이제 알 것 같아요."

"훌륭한."

"catch 문에서 '예외'는 무엇을 의미합니까?"

" 모든 예외는 Exception 클래스를 상속하는 클래스입니다. catch 블록 에 예외 클래스를 지정하여 특정 예외를 catch하거나 공통 상위 클래스인 Exception을 지정하여 모든 예외를 catch할 수 있습니다. 그러면 필요한 모든 오류를 얻을 수 있습니다. 변수 e의 정보(예외 개체에 대한 참조를 저장함)"

"멋지다! 내 방법에서 다른 예외가 발생하면 이를 다르게 처리할 수 있습니까?"

"할 수 있을 뿐만 아니라 해야 합니다. 다음과 같이 할 수 있습니다."

예:
public class ExceptionExample2
{
    public static void main(String[] args)
    {
        System.out.println("Program starts");

        try
        {
            System.out.println("Before calling method1");
            method1();
            System.out.println("After calling method1. This will never be shown");
        }
        catch (NullPointerException e)
        {
           System.out.println("Null reference. Exception has been caught");
        }
        catch (ArithmeticException e)
        {
            System.out.println("Division by zero. Exception has been caught");
        }
        catch (Exception e)
        {
            System.out.println("Any other errors. Exception has been caught");
        }

        System.out.println("Program is still running");
    }

    public static void method1()
    {
        int a = 100;
        int b = 0;
        System.out.println(a / b);
    }
}

" try 블록은 여러 catch 블록 과 쌍을 이룰 수 있으며 각 블록은 지정된 유형의 예외를 catch합니다."

"이해한 것 같아요. 아직 직접 작성할 수는 없지만 코드에서 발견하면 두렵지 않을 것입니다."