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(); // 예외 추적 메시지를 출력하는 메소드 (개발 중에는 이것만 사용한다.) } }