JavaRush /Java Blog /Random-KO /예외 및 처리
articles
레벨 15

예외 및 처리

Random-KO 그룹에 게시되었습니다
예외 또는 예외 상황(상태)은 프로그램이 작동하는 동안 프로그램에서 발생하는 오류입니다. Java의 모든 예외는 객체입니다. 따라서 예외 상황이 발생했을 때 자동으로 생성할 수 있을 뿐만 아니라, 개발자가 직접 생성할 수도 있습니다. 예외 클래스의 계층 구조: 예외 및 처리 - 1예외는 여러 클래스로 구분되지만 모두 공통 조상인 클래스를 갖습니다 Throwable. 그 자손은 서브클래스 Exception와 입니다 Error. 예외( Exceptions)는 원칙적으로 해결 및 예측이 가능한 프로그램 문제의 결과입니다. 예를 들어 정수에서 0으로 나누기가 발생했습니다. 오류( Errors)는 JVM 수준 문제이기 때문에 자체 프로그램에서 처리하려고 시도해서는 안 된다고 Java 사양에 명시되어 있는 더 심각한 문제입니다. 예를 들어, 가상 머신에 사용 가능한 메모리가 부족하면 이런 종류의 예외가 발생합니다. 프로그램은 여전히 ​​JVM에 추가 메모리를 제공할 수 없습니다. Java에서는 모든 예외를 확인된 예외( checked)와 오류( ) 및 런타임 예외( 클래스 자손 )를 unchecked포함하는 확인되지 않은 예외( )의 세 가지 유형으로 나눕니다 . 제어된 예외는 프로그램에서 처리할 수 있고 처리해야 하는 오류입니다. 클래스의 모든 하위 항목 ( 제외 )은 이 유형에 속합니다. 예외 처리는 연산자를 사용하여 수행 하거나 프로그램의 외부 부분으로 전송할 수 있습니다 . 예를 들어, 메서드는 자체적으로 처리하지 않고 호출 계층 구조의 상위에서 발생하는 예외를 전달할 수 있습니다. 확인되지 않은 예외는 처리할 필요가 없지만 원하는 경우 클래스 예외를 처리할 수 있습니다 . 다음 프로그램을 컴파일하고 실행해 보겠습니다. ErrorsRuntimeExceptionsExceptionExceptionRuntimeExceptiontry…catchRuntimeException
class Main {
     public static void main(String[] args) {
         int a = 4;
         System.out.println(a/0);
     }
}
실행되면 콘솔에 다음 메시지가 표시됩니다.
Exception in thread "main" java.lang.ArithmeticException: / by zero
        at Main.main(Main.java:4)
메시지에는 발생한 예외의 클래스가 표시됩니다 ArithmeticException. 이 예외는 다음과 같이 처리될 수 있습니다.
class Main {
     public static void main(String[] args) {
         int a = 4;
         try {
              System.out.println(a/0);
         } catch (ArithmeticException e) {
              System.out.println("Произошла недопустимая арифметическая операция");
         }
     }
}
이제 표준 오류 메시지 대신 블록이 실행됩니다. catch그 매개변수는 예외에 해당하는 클래스의 객체 e입니다(객체 자체에는 어떤 이름이라도 부여할 수 있으며, 강제로 throw하려면 필요합니다). 예를 들어 이 예외를 다시 처리하여 다른 핸들러를 확인합니다. 이 경우 블록 에는 try예외가 잠재적으로 발생할 수 있는 프로그램 조각이 포함됩니다. 하나는 try서로 다른 예외 클래스를 가진 여러 catch 블록에 해당할 수 있습니다.
import java.util.Scanner;
class Main {
    public static void main(String[] args) {
     int[] m = {-1,0,1};
        Scanner sc = new Scanner(System.in);
        try {
            int a = sc.nextInt();
            m[a] = 4/a;
            System.out.println(m[a]);
        } catch (ArithmeticException e) {
            System.out.println("Произошла недопустимая арифметическая операция");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Обращение по недопустимому индексу массива");
        }
    }
}
제시된 프로그램을 실행한 후 사용자가 키보드 1, 2를 입력하면 예외 없이 프로그램이 실행됩니다. 사용자가 0을 입력하면 클래스의 예외가 발생 ArithmeticException하고 첫 번째 블록에서 처리됩니다 catch. 사용자가 3을 입력하면 클래스 예외가 발생하고 ArrayIndexOutOfBoundsException(배열이 범위를 벗어남) 두 번째 블록에서 처리됩니다 catch. 사용자가 정수가 아닌 숫자(예: 3.14)를 입력하면 클래스 예외가 발생하고 InputMismatchException(입력 유형 불일치) 표준 오류 형식으로 발생합니다. 어떤 방식으로도 처리하지 않았기 때문입니다. 그러나 클래스에 대한 핸들러를 추가할 수 있습니다 Exception. 이 클래스는 검사된 다른 모든 예외의 상위 클래스이므로 해당 예외( 포함)를 모두 포착합니다 InputMismatchException.
import java.util.Scanner;
class Main {
    public static void main(String[] args) {
        int[] m = {-1,0,1};
        int a = 1;
        Scanner sc = new Scanner(System.in);
        try {
            a = sc.nextInt();
            m[a-1] = 4/a;
            System.out.println(m[a]);
        } catch (ArithmeticException e) {
            System.out.println("Произошла недопустимая арифметическая операция");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Обращение по недопустимому индексу массива");
        } catch (Exception e) {
            System.out.println("Произошло ещё Howое-то исключение");
        }
    }
}
예외는 클래스와 하위 클래스의 계층 구조를 기반으로 구축되므로 먼저 보다 구체적인 예외를 처리한 다음 보다 일반적인 예외를 처리해야 합니다. 즉, 예외 처리 클래스가 있는 첫 번째(세 번째가 아닌) 블록을 배치하면 Exception"다른 예외가 발생했습니다" 이외의 오류 메시지는 전혀 표시되지 않습니다(모든 예외는 이 블록에 의해 즉시 포착되며 도달하지 못합니다). 나머지). 블록에 대한 선택적 추가는 try…catchblock 이 될 수 있습니다 finally. 여기에 있는 명령은 예외 발생 여부에 관계없이 어떤 경우에도 실행됩니다. 처리되지 않은 예외가 발생하더라도 이 예외가 발생한 후 남은 프로그램 부분은 실행되지 않습니다. 예를 들어, 일부 긴 계산 중에 예외가 발생한 경우 finally중간 결과를 블록에 표시하거나 저장할 수 있습니다. 소스 링크: 예외 및 처리
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION