정의
프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것
목적
프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지합니다.
- 일반예외 (Exception) :
💻컴파일 시점에 발생하는 예외
- 실행예외 (RuntimeException) :
💻프로그램 실행시에 발생하는 예외
일반예외는 컴파일러가 체크해주지만, 실행예외는 컴파일러가 따로 체크해주지 못한다.
그러니 알아서 예외 처리 코드를 사용해야한다. 실행예외는 프로그램 실행 이후에 발생하는 예외이기 때문에, 따로 컴파일러가 예외 처리 코드를 강제하라고 하지 않는다. 온전히 개발자의 경험에 의해 예외 처리 코드를 사용해야 한다. 컴파일 시점에서 실행예외를 판단해 검사할 수가 없기 때문에, 개발자의 역량에 따라 실행 예외를 잘 막을 수도, 막지 못할수도 있다. 다른 의미에서는 일반예외보다 실행예외가 예외발생시 더 치명적
이다.이 2가지 종류의 Exception 을 처리하기 위해 자바에서는 java.lang.Exception
이라는 최상위 부모 클래스
를 제공합니다. 따라서 모든 Exception 들의 조상은 결국 java.lang.Exception 입니다.
파란색은 일반예외, 초록색은 런타임에러이다.
예외처리는 try, catch 문
을 사용한다.
try {
...
} catch(예외1) {
...
} catch(예외2) {
...
...
}
예외 처리 코드 Try - Catch - Finally
1️⃣ try 블럭 내에서 예외가 발생
한 경우
2️⃣ try 블럭 내에서 예외가 발생하지 않은
경우
- Try 블록 : 실제 코드가 들어가는 곳으로써 예외 Exeption이 발생할 가능성이 있는 코드
- Catch 블록 : Try 블록에서 Exeption이 발생하면 코드 실행 순서가 Catch 쪽으로 오게됨. 즉 예외에 대한 후 처리 코드
- Finally 블록 : Try 블록에서의 Exeption과 발생 유무와 상관 없이 무조건 수행되는 코드 (옵션이라 생략이 가능)
Try 블록 수행 -> Finally 블록 수행 (생략가능)
package Exception;
//예외 발생 X
public class Ex_1 {
public static void main(String[] args) {
System.out.println(1);
try {
System.out.println(2);
System.out.println(3);
} catch (Exception e) {
System.out.println(4);
} //try-catch의 끝
System.out.println(5);
}
}
출력:
1
2
3
5
Try 블록 수행 -> Catch 블록 수행 -> Finally 블록 수행 (생략가능)
package Exception;
// 예외 발생 O
public class Ex_2 {
public static void main(String[] args) {
System.out.println(1);
try {
System.out.println(0/0); //예외발생!
System.out.println(2); //실행되지 않음
} catch (ArithmeticException ae) {
System.out.println(3);
} //try-catch문의 끝
System.out.println(4);
} //main 메서드의 끝
}
출력:
1
3
4
package Exception;
public class Exception {
public static void main(String[] args) {
System.out.println(1);
System.out.println(2);
try {
System.out.println(3);
System.out.println(0/0);
System.out.println(4);
} catch (ArithmeticException ae) {
if (ae instanceof ArithmeticException)
System.out.println("true");
System.out.println("ArithmeticException");
} catch (Exception e) {
System.out.println("Exception");
}
System.out.println(5);
}
}
Exception
이 선언된 catch 블럭은 모든 예외 처리가 가능하다. 따라서 catch문의 가장 마지막에 위치해야한다! (모든 예외처리가 가능해서 다른 catch문이 의미없어지기 때문)