예외 처리

자바 문법에 맞지 않게 코드를 작성하고 컴파일하려고 하면, 자바 컴파일러는 문법 오류(syntax error)가 발생한다.

또한, 자바 문법에는 맞게 작성되었다 하더라도 프로그램이 실행되면서 예상하지 못한 오류가 발생할 수 있다.

이렇게 예상하지 못한 사태가 발생하여 실행 중인 프로그램이 영향을 받는 것을 오류(error)라고 하며 이는 심각한 문제를 초래할 수 있다.

이러한 오류(error)는 개발자가 미리 예측할 수 없기에 예외(exception) 처리를 하여 발생할 수 있는 상황을 다른 흐름으로 바꿀 필요가 있다.


예외 처리 방법

1
2
3
4
5
6
7
8
9
10
11
try {
    예외를 처리하길 원하는 실행 코드;
} catch (error1) {
    error1 예외가 발생할 경우에 실행될 코드;
} catch (error2) {
    error2 예외가 발생할 경우에 실행될 코드;
}
...
finally {
    예외 발생 여부와 상관없이 무조건 실행될 코드;
}


자주 사용하는 예외처리

  • 0으로 나누기
  • 배열 인덱스 초과
  • 없는 파일 열기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//0으로 나누기
try{
    int a = 3 / 0;
}catch (ArithmeticException e){
    System.out.println("에러 내용: "+e);
}

//console log
에러 내용: java.lang.ArithmeticException: / by zero

    
//배열 인덱스 초과
int[] b = new int[4];

try{
    b[4] = 1;
}catch (ArrayIndexOutOfBoundsException e){
    System.out.println("에러 내용: "+e);
}

//console log
에러 내용: java.lang.ArrayIndexOutOfBoundsException: Index 4 out of bounds for length 4

        
//없는 파일 열기
try {
    BufferedReader br = new BufferedReader(new FileReader("abc.txt"));
}catch (FileNotFoundException e){
    System.out.println("에러 내용: "+e);
}

//console log
에러 내용: java.io.FileNotFoundException: abc.txt (지정된 파일을 찾을  없습니다)


예외 던지기

throw

  • 개발자가 의도적으로 예외를 발생 시킨 후 처리할 때 사용

    • 은행 업무를 처리하는 프로그램에서 잔고 부족과 같은 예외는 API에 존재하지 않는데 이런 경우에는 개발자가 직접 예외를 정의해야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*
 은행 계좌(Account) 클래스를 작성한것이다. 
 출금(withdraw) 메소드에서 잔고(balance) 필드와 출금액을 비교하여 잔고가 부족하면 
 BalanceInsufficientException 을 발생 시키도록 했다.
*/

public class Account {
    // 예외 클래스 작성 : 예외 클래스 작성시 클래스명 뒤에 Exception을 상속
    public static class BalanceInsufficientException extends Exception{
        public BalanceInsufficientException(String message){
            super(message);
        }
    }
    
    // 필드
    private long balance;
    // 생성자
    public Account(){}
    // 메소드
    public void deposit(int money){
        balance+=money;
    }

    // 사용자 정의 예외 발생시키기
    public void withdraw(int money) throws BalanceInsufficientException{
        if(balance<money){
            // 잔고 부족: throw로 BalanceInsufficientException 발생
            throw new BalanceInsufficientException("잔고부족: " + (money - balance) + "원이 모자릅니다.");
        }
        balance-=money;
    }

    public static void main(String[] args) {
        Account account = new Account();
        //예금
        account.deposit(1000);
        System.out.println("예금액: "+account.balance);
        //출금
        try{
            account.withdraw(3000);
        }catch (BalanceInsufficientException e){
            System.out.println(e.getMessage());	//사용자 정의 예외 메세지 발생
        }
    }
}


throws

  • 예외가 발생하면 상위 메소드로 예외를 전가시킬때 사용

  • main() 메소드에서는 try-catch로 예외를 최종 처리하는 것이 바람직하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ThrowExample {
    public static void findClass() throws ClassNotFoundException{ //throws를 통해 상위 메소드로 예외를 전가
        Class c = Class.forName("java.lang.String2"); //java.lang.String2라는 클래스는 존재하지 않으므로 오류를 발생시킨다.
    }
    
    public static void main(String[] args) {
        // findClass 메소드에서 온 예외를 처리하는 구문을 작성한다.
        try{
            findClass();
        } catch (ClassNotFoundException e) {
            System.out.println("클래스가 존재하지 않습니다.");
        }
    }
}

카테고리:

업데이트:

댓글남기기