ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 🎮 [JAVA 자바] #6 | 자바 예외처리, Try-catch-finally, 다중 catch, Checked / Unchecked 예외, throw, throws
    CS/Java 2022. 4. 17. 02:40

     


    🎮 예외처리

     - 자바의 오류 

    1. 컴파일 오류 : 실행 전 문법적 오류

    2. 런타임 오류 :

         - 예외(Exception) : 프로그램 실행 도중 오류가 발생했지만 동작을 계속 수행할 수 있는 오류. 동작 가능, 처리 가능

         - 에러(Error) : 프로그램이 더 이상 동작할 수 없는 심각한 오류로 예측 불가능, 수습 불가능 (ex. VM고장, OutOfMemory, 스택이상)

    3. 논리적 오류 : 디버거 통해서 해결

     

     - 자바의 예외 처리 (Exception Handling)

    프로그램 실행 도중 에러에 대해서는 프로그램에서 처리(핸들링)하지 않고 예외에 대해서만 처리(핸들링)

    예외의 발생에 대비한 코드를 작성하는 것이 예외 처리로, 예외가 발생되었을 때 강제 종료되지 않고 정상 실행 되도록 처리함이 목적

     

    * 처리 가능 오류 : 정수를 0으로 나누기, 배열 인덱스 범위 벗어남, 존재하지 않는 파일 열기, 정수 입력 받아야되는데 문자 입력된 경우

     

     - java.lang.Throwable 

    String getMessage() : 오류의 원인을 담고 있는 문자열 반환

    void printStackTrace() : 오류가 발생한 위치메소드 정보 출력

     

    - 오류 관련 클래스들의 계층도

    모든 예외 클래스들은 java.lang.Exception 클래스를 상속받음

    더보기

     

    [ Exception의 분류 ]

    1. 예외 정의에 따른 분류

    • System defined Exception
    • User defined Exception

    2. 컴파일 처리방식에 따른 분류

    • Unchecked Exception : 컴파일러가 명시적으로 예외처리 요구하지 않음 (RuntimeException + 후손들)
    • Checked Exception : 컴파일러가 명시적으로 예외처리를 요구 (Exception 후손들 중 Unchecked Exception 아닌 것들)

    * NumberFormatException : (ex. 객체 요소들 정수로 변환하려 했는데 실수가 존재 (Integer.parseInt(stringNumber[i])) )

    * ArithmeticException : (ex. 나눗셈에서 분모에 0이 들어감)

    * ArrayIndexOutOfBoundsException : 배열 인덱스 범위 벗어남 (ex. 배열 크기 4인데(index:0~3) 인덱스 4에 접근)

    * InputMismatchException : (ex. scanner.nextInt()에서 정수 입력받게 했는데 문자 입력됨)

    * Exception : 모든 예외. 하지만 catch (Exception e)는 권장되지 않음

    * IOException 또는 FileNotFoundException : (ex. FileWriter fo = new FileWriter("log.txt"))

     

     - 예외의 처리 과정 

    1. 명령 실행 중 예외 발생

    2. 예외 원인에 따른 Exception 객체 생성 (in JVM)

    3. 생성한 Exception 객체를 프로그램에 던짐 (Throw)

    4. 생성한 Exception 객체를 catch하지 않으면 강제종료. catch하면 정상종료 (in Program)


    🎮 Try-catch-finally

    try {
        // 예외가 발생할 가능성이 있는 코드
    }
    catch (처리할 예외 타입 1) { // catch는 1개 이상
        // catch한 예외를 처리
    }
    catch (처리할 예외 타입 2) {
        // catch한 예외를 처리
    }
    finally { // 생략 가능
        // 예외가 있든 없든 실행되는 코드
    }

     - 예외 처리문의 실행 흐름 

    try 블록에서 예외 발생 X : 바로 finally 블록으로 간다.

    try 블록에서 예외 발생 0 : 예외 타입에 맞는 catch 블록으로 들어간 뒤, finally 블록으로 간다.

     

     - 0으로 나누는 예제 

    try {
        result = dividend / divisor;
    } catch (ArithmeticException e) {
        System.out.println("Catch : 0으로 나눌 수 없습니다." + e.getMessage());
        // '/ by zero' 출력
        // 다중 오류면 null 출력
    } finally {
        System.out.println("Finally:");
    }

    🎮 다중 catch문

     - 다중 catch문

    실행문 여러개인 경우 발생할 수 있는 예외 종류도 많아진다.

    catch블록 여러개 써서 발생된 예외와 일치하는 catch문 수행하면 된다.

    try-catch문 안에 또 try-catch써서 중첩 가능. 하지만 예외를 받을 변수로 같은 이름을 쓰면 오류.

    try {
        ...
    } catch (ArithmeticException e) { // 예외 타입 1
        System.out.println(e.getMessage());
    } catch (InputMismatchException e) { // 예외 타입 2
        System.out.println(e.getMessage());
    } finally {
        ...
    }

    🎮 Checked / Unchecked 예외 

     - Unchecked Exception 예외 전파  

    예외가 발생된 곳에서 처리되지 않으면 상위 레벨(그 메소드 호출한 함수)로 전파된다.

    1) 예외가 catch되어 처리될 때까지  2) 또는 main()에 도달할 때 까지 전파된다.

     

    만약 메인함수의 try블록에 예외가 일어날 수 있는 함수를 적고, 그 함수에서 예외처리를 안했다면, 메인함수의 catch블록에서 처리해주면 된다.

     

     - checked Exception 예외 처리  

    1) 자신이 처리하든지  2) 명시적으로 떠 넘기던지(throws)를 선언해야함. 컴파일러가 검사

     

    * Unchecked Exception : 컴파일러가 명시적으로 예외처리 요구하지 않음 (RuntimeException + 후손들)

    * Checked Exception : 컴파일러가 명시적으로 예외처리를 요구 (Exception 후손들 중 Unchecked Exception 아닌 것들)

    * 종류는 위에 '오류 관련 클래스들의 계층도'에 있음


    🎮 throw, throws

     - Throw문 

    명시적(강제적)으로 예외 발생시킴. 사용자 정의 또는 필요에 의한 Exception 클래스 예외 발생시 사용. 특히 checked 처리를 떠넘길 때 사용. 예외가 발생한 곳에서 예외처리 안하고 호출한 곳으로 발생된 예외를 떠넘김. 적어도 메인 메소드에서는 try-catch 처리 해줘야됨. 

    throw new Exception클래스( [args] );

    public void someFuntion() throws Exception // 예외를 caller에게 떠넘김
    {
        throw new Exception("MyException"); // checked exception
        throw new RuntimeException("MyException"); // unchecked exception. throws할 필요 X
    }

    🎮 Assert문

     - Assert (JDK 1.4)  

    어떤 내용에 대해서 확실한 단언을 할 때 사용하는 키워드로, 실행시에 화면출력 없이 변수나 코드의 흐름에 대해서 검증할 수 있는 코드 작성 가능. 

    assert [boolean 식]; -> false이면 AssertError가 발생되어 비정상 종료

    int a=1;
    
    assert a==0; // 반드시 변수 a가 0이어야 한다는 뜻이다. 0이 보장되어야하는데 1이므로 AsserError발생

    기본적으로 Assertion기능 수행되지 않도록 설정되어있어서, 설정의 Debug Configurations에서 VM arguments-ea라고 써준다. (-da는 disable하게 해준다.)