본문

[2017.08.18] 12. 예외처리(Exception) 기본

예외처리는 말 그대로 '정상적인 방법이 아닌 예외를 처리하는 방법' 이다.


자바에서 예외처리를 하기위해 예외처리 문법을 먼저 익히자.

예외처리 문법(try, catch, finally의 역할)

1
2
3
4
5
6
7
8
9
10
11
public class Main {
    public static void main(String[] args) {
        try {
            // 예외 발생이 예상되는 로직 
        } catch (Exception e) {
            // 예외 발생을 처리하는 로직 
        } finally {
            // 예외와 상관없이 실행되는 로직 
        }
    }
}
cs

finally를 사용하는 이유는 예를 들어 생각해보자.

try문 안에서 파일 스트림을 생성한다고 가정하자(파일 스트림은 사용 후 메모리를 위해 꼭 닫아야 한다.) 그런데 파일 오류가 아닌 다른 예외 발생으로 try-catch문이 종료되었다. 그러면 파일 스트림이 닫히지 않는다. 이러한 경우 finally 안에서 파일 스트림을 닫아 문제를 해결 할 수 있다.

Java 7 버전 이후에는 try-with문으로 finally없이 처리 가능(http://heepie.tistory.com/62)



예외처리 함수 구분

구분

리턴값 여부

내용 

이후 실행 여부 

원인

원인 종류

예외 발생 위치

 getMessage

O

X

X

O

toString

O

O

O

X

printStackTrace 

X

O

O

O



다양한 예외처리

Exception으로 한 번에 모든 예외 처리가 가능하지만

각각의 예외 상황에 따라 처리를 해야 할 때가 필요하다.


 올바른 다양한 예외처리

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
    public static void main(String[] args) {
        try {
            System.out.println(10/0);
        } catch (ArithmeticException e) {
            System.out.println("ArithmeticException 발생");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("ArrayIndexOutOfBoundsException 발생");
        } catch (Exception e) {
            System.out.println("이외 Exception 발생");
        }
    }
}

cs


올바르지 않은 다양한 예외처리

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
    public static void main(String[] args) {
        try {
            System.out.println(10/0);
        } catch (Exception e) {
            System.out.println("이외 Exception 발생");
        } catch (ArithmeticException e) {                // 오류발생
            System.out.println("ArithmeticException 발생");
        } catch (ArrayIndexOutOfBoundsException e) {     // 오류발생
            System.out.println("ArrayIndexOutOfBoundsException 발생");
        } 
    }
}

cs

catch의 첫번째 순서로 가장 큰 범위인 Exception 설정되면 뒤에 나오는 Exception은 무의미하기 때문에 컴파일 전 오류가 발생한다.



예외처리 문법(throws) - 책임 전가


throws는 책임을 전가하는 방법이다. 직장의 예를 들어보자.

회사는 직급체계가 있고 역할이 있다. 

예를 들어보면, 사장이 팀장에게 보고서를 요청하면 팀장은 과장에게 과장은 사원에게 보고서를 요청한다. 

(예들 들기 위함일 뿐이다.)

그러면 팀원들은 보고서를 만드는 대신 보고결과에 따른 책임은 팀장에게 전가한다.


이처럼 자바에서도 책임을 전가하는 문법이 throws이다.

예외처리 방법은 

1. try/catch로 자신이 처리

2. throws로 책임을 전가해 처리

3. throw로 직접 Exception 발생

두 가지이다.


코드로 살펴보자. 색깔로 천천히 확인해보자.

※ 현실에서는 팀장은 책임지지 않습니다........



예외처리 문법(throw) - 내가 원할 때, 원하는 Exception을 직접 발생


throw는 내가 원할 때, 원하는 Exception을 능동적으로(직접) 발생 시키는 방법이다. 

그림과 같이 직접 Exception을 발생시키면 해당 Exception의 인스턴스는 catch 구문으로 전달된다.

전달 된 후 printStackTrace를 통해 입력한 문구가 콘솔 창에 출력되는 것을 확인 할 수 있다.



# 예외처리 #exception #try #catch #throws #throw #finally

공유

댓글