JAVA chapter10. 예외처리.


10.4 예외 종류에 다른 처리 코드

10.4.1 다중 catch

// catch 블록이 여러 개라 할지라도 단 하나의 catch 블록만 실행된다.


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
package sec04_multi_catch;
 
public class CatchByExceptionKindExample {
    public static void main(String[] args) {
        try {
            String data1 = args[0];
            String data2 = args[1];
            int value1 = Integer.parseInt(data1);
            int value2 = Integer.parseInt(data2);
            int result = value1 + value2;
            System.out.println(data1 + "+" + data2 + "=" + result);
        } catch(ArrayIndexOutOfBoundsException e) {
            System.out.println("실행 매개값의 수가 부족합니다.");
            System.out.println("[실행 방법]");
            System.out.println("java CatchByExceptionKindExample  num1  num2");
            System.out.println("-------------------");
        } catch(NumberFormatException e) {
            System.out.println("숫자로 변환할 수 없습니다.");
            System.out.println("-------------------");
        } finally {
            System.out.println("다시 실행하세요.");
        }
    }
}
 
cs



10.4.2 catch 순서

// 다중 catch 블록을 작성할 때 주의할 점은 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 한다.

// 상위 예외 클래스의 catch 블록이 위에 있다면, 하위 예외 클래스의 catch 블록은 실행되지 않는다.

// 왜냐하면, 하위 예외는 상위 예외를 상속했기 때문에 상위 예외 타입도 되기 때문이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package sec04_multi_catch;
 
public class CatchOrderExample {
    public static void main(String[] args) {
        try {
            String data1 = args[0]; // ArrayIndexOutOfBoundsException이 발생하면 첫 번째 catch 블록을 실행.
            String data2 = args[1];
            int value1 = Integer.parseInt(data1);
            int value2 = Integer.parseInt(data2);
            int result = value1 + value2;
            System.out.println(data1 + "+" + data2 + "=" + result);
        } catch(ArrayIndexOutOfBoundsException e) { // ArrayIndexOutOfBoundsException이 발생하면 첫 번째 catch 블록을 실행.
            System.out.println("실행 매개값의 수가 부족합니다.");
        } catch(Exception e) { // 그 밖의 다른 예외가 발생하면 두 번째 catch 블록을 실행.
            System.out.println("실행에 문제가 있습니다.");
        } finally {
            System.out.println("다시 실행하세요.");
        }
    }
}
cs



10.4.3 멀티 catch


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package sec04_multi_catch;
 
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
 
public class MultiCatchExample {
    public static void main(String[] args) {
        try {
            String data1 = args[0];
            String data2 = args[1];
            int value1 = Integer.parseInt(data1);
            int value2 = Integer.parseInt(data2);
            int result = value1 + value2;
            System.out.println(data1 + "+" + data2 + "=" + result);
        } catch(ArrayIndexOutOfBoundsException | NumberFormatException e) {
            System.out.println("실행 매개값의 수가 부족하거나 숫자로 변환할 수 없습니다..");
        } catch(Exception e) {
            System.out.println("알수 없은 예외 발생");
        } finally {
            System.out.println("다시 실행하세요.");
        }
    }
}
cs



10.5 자동 리소스 닫기

// 리소스 객체는 java.lang.AutoCloseable 인터페이스를 구현하고 있어야 한다.

// AutoCloseable에는 close() 메소드가 정의되어 있는데 try-with-resources는 바로 이 close() 메소드를 자동 호출한다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package sec05_try_with_resources;
 
public class FileInputStream implements AutoCloseable {
    private String file;
    
    public FileInputStream(String file) {
        this.file = file;
    }
    
    public void read() {
        System.out.println(file + "을 읽습니다.");
    }
    
    @Override
    public void close() throws Exception {
        System.out.println(file + "을 닫습니다.");
    }
}
cs

1
2
3
4
5
6
7
8
9
10
11
12
package sec05_try_with_resources;
 
public class TryWithResourceExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("file.txt")) {
            fis.read();
            throw new Exception(); // 강제적으로 예외 발생시킴 (예외가 발생되는 즉시 close가 실행됨)
        } catch(Exception e) {
            System.out.println("예외 처리 코드가 실행되었습니다.");
        }
    }
}
cs



10.6 예외 떠넘기기



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package sec06_throws;
 
public class ThrowsExample {
    public static void main(String[] args) {
        try {
            findClass();
        } catch(ClassNotFoundException e) {
            System.out.println("클래스가 존재하지 않습니다.");
        }
    }
    
    public static void findClass() throws ClassNotFoundException { // 호출한 곳에서 예외 처리
        Class clazz = Class.forName("java.lang.String2");
    }
}
cs



10.7 사용자 정의 예외와 예외 발생

10.7.1 사용자 정의 예외 클래스 선언



1
2
3
4
5
6
7
8
package sec07_user_define_exception;
 
public class BalanceInsufficientException extends Exception {
    public BalanceInsufficientException() { }
    public BalanceInsufficientException(String message) {
        super(message);
    }
}
cs



10.7.2 예외 발생시키기

// 앞의 throw와는 완전 다르다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package sec07_user_define_exception;
 
public class Account {
    private long balance;
 
    public Account() { }    
 
    public long getBalance() {
        return balance;
    }    
    public void deposit(int money) {
        balance += money;
    }
    public void withdraw(int money) throws BalanceInsufficientException { // 사용자 정의 예외 떠넘기기
        if(balance < money) {
            throw new BalanceInsufficientException("잔고부족:"+(money-balance)+" 모자람"); // 사용자 정의 예외 발생
        }
        balance -= money;
    }
}
cs


10.8 예외 정보 얻기

// 개발이 다 되고나면 보기가 좋지 않으므로 주석처리해야한다, 개발자가 개발을 할 때만 사용



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package sec07_user_define_exception;
 
public class Account {
    private long balance;
 
    public Account() { }    
 
    public long getBalance() {
        return balance;
    }    
    public void deposit(int money) {
        balance += money;
    }
    public void withdraw(int money) throws BalanceInsufficientException {
        if(balance < money) {
            throw new BalanceInsufficientException("잔고부족:"+(money-balance)+" 모자람");
        }
        balance -= money;
    }
}
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package sec07_user_define_exception;
 
public class AccountExample {
    public static void main(String[] args) {
        Account account = new Account();
        //예금하기
        account.deposit(10000);
        System.out.println("예금액: " + account.getBalance());
        //출금하기
        try {
            account.withdraw(30000);
        } catch(BalanceInsufficientException e) { // 예외 메세지 얻기
            String message = e.getMessage();
            System.out.println(message);
            System.out.println(); // 예외 추적 후 출력
            e.printStackTrace();
        }
    }
}
cs

1
2
3
4
5
6
7
8
package sec07_user_define_exception;
 
public class BalanceInsufficientException extends Exception {
    public BalanceInsufficientException() { }
    public BalanceInsufficientException(String message) {
        super(message);
    }
}
cs




Posted by 너래쟁이
: