JAVA chapter10. 예외처리. 10.4 예외 종류에 따른 처리 코드. 10.5 자동 리소스 닫기. 10.6 예외 떠넘기기. 10.7 사용자 정의 예외와 예외 발생. 10.8 예외 정보 얻기
JAVA/CONCEPT 2018. 2. 1. 15:43 |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 |
'JAVA > CONCEPT' 카테고리의 다른 글
JAVA chapter 06. 클래스. 6.8 메소드 (0) | 2018.01.26 |
---|---|
JAVA chapter 04. 조건문과 반복문. 4.3 반복문 (for문, while문, do-while문) (0) | 2018.01.25 |
JAVA chapter 03. 연산자. 3.4 이항 연산자 3.5 삼항 연산자 (0) | 2018.01.25 |
JAVA chapter17. javaFX. 17.10 JavaFX CSS 스타일(3) (0) | 2018.01.21 |
JAVA chapter17. javaFX. 17.10 JavaFX CSS 스타일(2) (0) | 2018.01.21 |