오류(error)와 예외(exception)
- 오류
- 시스템 레벨에서 프로그램에 심각한 문제를 야기하여 실행 중인 프로그램을 종료시키는 것
- 개발자가 미리 예측하여 처리할 수 없는 것이 대부분이라서 오류에 대한 처리는 할 수 없다.
- 예외
- 오류와 마찬가지로 실행 중인 프로그램을 비정상적으로 종료시킨다.
- 발생할 수 있는 상황을 미리 예측하여 처리할 수 있다.
- 개발자는 예외 처리(exception handling)를 통해 예외 상황을 처리할 수 있도록 코드의 흐름을 바꿀 필요가 있다.
예외 처리(exception handling)
- try 블록
- 기본적으로 맨 먼저 실행되는 코드로 여기에서 발생한 예외는 catch 블록에서 처리된다.
- 필수적으로 사용
- 1번만 선언할 수 있다.
- catch 블록
- try 블록에서 발생한 예외 코드나 예외 객체를 인수로 전달받아 그 처리를 담당한다.
- 선택적으로 사용
- 여러 번 선언할 수 있다.
- 예외가 발생하면, try 블록과 가장 가까운 catch 블록부터 순서대로 검사한다. (★)
- finally 블록
- 이 블록은 try 블록에서 예외가 발생하건 안 하건 맨 마지막에 무조건 실행된다.
- 선택적으로 사용
- 1번만 선언할 수 있다.
catch 블록과 finally 블록 중 1개는 있어야 한다.
- 사용 예시
예외(Exception) 클래스
- Java에서 모든 예외의 조상 클래스
- 종류
- RuntimeException 클래스
- 주로 치명적인 예외 상황을 발생시키지 않는 예외들로 구성
- try-catch 문을 사용하기보다는 프로그램을 작성하면서 예외가 발생하지 않도록 주의를 기울이는 편이 좋다.
- 그 외의 Exception 클래스의 자식 클래스
- 치명적인 예외 상황을 발생시킨다.
- 반드시 try-catch 문을 사용하여 예외를 처리해야 한다.
- 자바 컴파일러는 RuntimeException 클래스 이외의
Exception 클래스의 자식 클래스에 속하는 예외가 발생할 가능성이 있는 구문에는
반드시 예외를 처리하도록 강제하고 있다.
- RuntimeException 클래스
- 자주 사용되는 예외 클래스
- ClassCastException
- 수행할 수 없는 타입 변환이 진행될 경우
- ArrayIndexOutOfBoundsException 배열에 잘못된 인덱스를 사용하여 접근할 경우
- NullPointerException
- null 객체의 인스턴스 메소드를 호출하는 등의 경우
- ArithmeticException
- 산술 연산에서 정수를 0으로 나누는 등 연산을 수행할 수 없는 경우
- ClassCastException
### Throwable 클래스
- Exception 클래스와 모든 오류의 조상이 되는 Error 클래스의 부모 클래스
- hrowable 타입과 이 클래스를 상속받은 서브 타입만이 자바 가상 머신(JVM)이나 throw 키워드에 의해 던져질 수 있다.
- 메소드
- getMessage()
- 해당 throwable 객체에 대한 자세한 내용을 문자열로 반환한다.
- printStackTrace()
- 해당 throwable 객체와 표준 오류 스트림(standard error stream)에서
해당 객체의 스택 트레이스(stack trace)를 출력한다.
- 해당 throwable 객체와 표준 오류 스트림(standard error stream)에서
- toString()
- 해당 throwable 객체에 대한 간략한 내용을 문자열로 반환한다.
- getMessage()
- 사용 예시
예외 발생
- Java에서는 throw 키워드를 사용하여 강제로 예외를 발생시킬 수 있다.
- 사용 예시
예외 회피
- 사용 예시
사용자 정의 예외 클래스
- Java에서는 Exception 클래스를 상속받아 새로운 예외 클래스를 정의할 수 있다.
- 생성자뿐만 아니라 필드 및 메소드도 원하는 만큼 추가할 수 있다.
- 요즘에는 예외 처리를 강제하지 않는 RuntimeException 클래스를 상속받아 작성하는 경우가 많다.
- 사용 예시
try-with-resources 문
- 사용한 자원을 자동으로 해제
- Java SE 7부터 제공
- 사용 예시