
try - catch문을 이용해서 예외 발생으로 인해 프로그램이 종료되는 것을 회피할 수 있음
try - catch문으로 예외 처리를 해야 함try - catch문이 없어도 실행 가능
예외를 처리할 때 사용하는 코드
실행할 코드는 try 블록에 두고 예외를 처리할 코드는 catch 블록에 두는 방식
try 블록의 코드를 실행하다가 예외가 발생되면 발생된 예외는 자동으로 catch 블록으로 전달됨
모든 예외는 자바 클래스로 만들어져 있음
try {
실행 코드
} catch(예외 타입 선언) {
예외 처리 코드
}
하나의 try 블록에 여러 개의 catch 블록이 추가될 수 있음
try 블록에서 발생된 예외는 우선 첫 번째 catch 블록을 방문함
첫 번째 catch 블록이 처리하지 못하면 다시 두 번째 catch 블록을 방문함
예외 클래스들의 상속 관계를 파악한 뒤 catch 블록을 작성해야 함
슈퍼클래스 타입인 Exception이나 RuntimeException의 경우에는 마지막 catch 블록에서 처리
try {
실행 코드
} catch(예외 타입 선언1) {
예외 처리 코드1
} catch(예외 타입 선언2) {
예외 처리 코드2
}
try-catch문의 마지막 블록으로 추가할 수 있다. (생략 가능)
예외 발생 여부와 상관 없이 항상 마지막에 실행된다.
주로 어떤 자원을 반납(close)할 때 사용
try {
실행 코드
} catch(예외 타입 선언) {
예외 처리 코드
} finally {
무조건 실행되는 코드
}
public static void main(String[] args) { // 나이를 입력 받아서 "주류 구매 가능", "주류 구매 불가능" 출력하기 // 예외처리 // try 블록과 finally 블록에서 모두 사용할 수 있도록 scope 조정 Scanner sc = null; // 선언 try { sc = new Scanner(System.in); // 생성 System.out.println("몇 살이세요?"); int age = sc.nextInt(); System.out.println(age >= 20 ? "주류 구매 가능" : "주류 구매 불가능"); } catch (Exception e) { System.out.println("잘 모르겠어요."); } finally { sc.close(); // finally는 주로 자원 반납용으로 사용한다. } }
scope : 범위 { }, 변수에 접근할 수 있는 범위의 기준이 된다.life cycle) : 변수가 선언된 위치(scope) 내에서 생성되고 소멸되는 주기를 의미한다.close()직접 생성(new)해서 던질 때 사용한다.메소드에서 발생하는 모든 예외를 던질 때 사용한다.
메소드 내부에서 try-catch를 처리하지 않고, 메소드를 호출하는 곳으로 예외를 던질 때 사용한다.
메소드를 호출하는 곳에서 try-catch를 처리한다.
2개 이상의 예외를 명시할 수 있기 때문에 throw가 아닌 throws라고 한다.
public static void ex01() { try { // 1. Java가 발생시킨 예외 // int a = 5 / 0; // System.out.println(a); // 2. 개발자가 발생시킨 예외 throw new RuntimeException("개발자 예외"); } catch (Exception e) { // 예외 객체 e가 가진 메소드 // 예외 클래스 확인하기 System.out.println(e.getClass().getName()); // Object의 메소드 활용 // 예외 메시지 확인하기(예외가 발생한 이유) System.out.println(e.getMessage()); } }
public static void ex02(String name) { try { System.out.println(name.substring(0, 1)); } catch (Exception e) { e.printStackTrace(); // 예외 추적 메시지를 출력하는 메소드 (개발 중에는 이것만 사용한다.) } }