[java]-Exception Handling

자바의 핵심적인 예외처리 방법인 try-catch 문과 예외 전가에 대해 이해하고 설명할 수 있다.

Exception Handling

GOALS:

  • 프로그래밍에서 예외 처리가 무엇인지 이해할 수 있다.
  • 컴파일 에러와 런타임 에러의 차이를 이해하고 설명할 수 있다.
  • 자바 예외 클래스의 상속 계층도를 통해 클래스 간 관계를 이해할 수 있다.
  • 자바의 핵심적인 예외처리 방법인 try-catch 문과 예외 전가에 대해 이해하고 설명할 수 있다.
  • throws 키워드와 throw 키워드의 차이에 대해 설명할 수 있다.

사실 프로그래밍에서 제일 중요한 것이 예외처리이다.
자바에서의 exception handling은 예상 가능한 예외를 처리하는 것이다.
예를 들어 사용자의 입력 예외, 인덱스 초과, 존재하지 않는 파일 찾기 등등이 있다.
그래서 자바에서는 컴파일러가 예외 처리를 권장하는 경우가 있고, 없는 부분이 있다.

이제 자바에서의 예외 처리를 보도록 해보자.

try{
	// 시도할 코드. 예외가 생길 수 있는 코드
} catch(ExceptionType1 e1) {
	// ExceptionType1 유형의 예외 발생 시 실행할 코드
} catch(ExceptionType2 e2) {
	// ExceptionType2 유형의 예외 발생 시 실행할 코드
}
finally {
	// 필수는 아닌데 예외가 있든 없든 실행됨
}

이렇게 구성된다. 이제 이 코드를 예제 코드로 구현해보자.

public class RuntimeExceptionTest {
 
    public static void main(String[] args) {
 
        try {
            System.out.println("[소문자 알파벳을 대문자로 출력하는 프로그램]");
            printMyName(null); // (1) 예외 발생
            printMyName("abc"); // 이 코드는 실행되지 않고 catch 문으로 이동
        } 
        catch (ArithmeticException e) {
            System.out.println("ArithmeticException 발생!"); // (2) 첫 번째 catch문
        } 
        catch (NullPointerException e) { // (3) 두 번째 catch문
            System.out.println("NullPointerException 발생!"); 
            System.out.println("e.getMessage: " + e.getMessage()); // (4) 예외 정보를 얻는 방법 - 1
            System.out.println("e.toString: " + e.toString()); // (4) 예외 정보를 얻는 방법 - 2
            e.printStackTrace(); // (4) 예외 정보를 얻는 방법 - 3
        } 
        finally {
            System.out.println("[프로그램 종료]"); // (5) finally문
        }
    }
 
    static void printMyName(String str) {
        String upperCaseAlphabet = str.toUpperCase();
        System.out.println(upperCaseAlphabet);
    }
}
// 출력값
[소문자 알파벳을 대문자로 출력하는 프로그램]
NullPointerException 발생!
e.getMessage: null
e.toString: java.lang.NullPointerException
[프로그램 종료]
java.lang.NullPointerException
	at RuntimeExceptionTest.printMyName(RuntimeExceptionTest.java:20)
	at RuntimeExceptionTest.main(RuntimeExceptionTest.java:7)

위의 코드에서 NullPointerException e, ArithmeticException e 의 정해진 키워드로 예외를 던질 수 있지만
우리가 예외를 method로 정의해서 던져줘서 처리할 수도 있다.

예를 들어,

public class ThrowExceptionTest {
 
    public static void main(String[] args) {
        try {
            throwException();
        } catch (ClassNotFoundException e) {
            System.out.println(e.getMessage());
        }
    }
 
    static void throwException() throws ClassNotFoundException, NullPointerException {
        Class.forName("java.lang.StringX");
    }
}
 
//출력값
java.lang.StringX

이렇게 따로 method에 정의해서 예외를 받아 처리할 수 있고, 정의를 하지 않고 아래와 같이 try - catch 안에서 처리할 수도 있다.

public class ExceptionTest {
 
    public static void main(String[] args) {
        try {
            Exception intendedException = new Exception("의도된 예외 만들기");
            throw intendedException;
        } catch (Exception e) {
            System.out.println("고의로 예외 발생시키기 성공!");
        }
    }
    
}
 
//출력값
고의로 예외 발생시키기 성공!
Comments

첫번째 댓글을 남겨주세요 :)

Post comment

0/500