예외처리
- 프로그램 실행 시 발생 할 수 있는 오류
- 에러(error): 시스템, 운영체제, JVM문제. 코드에 의해 수습 불가.
- 예외(exception): 개발자나 사용자에 의해 발생하는 문제. 코드로 수습 가능
- 예외처리: 프로그램 실행 시 발생하는 예외에 대비하는 코드를 작성하는 것
- CheckedException: 사용자의 잘못된 사용으로 발생하는 예외
- RuntimeException: 프로그래머의 잘못된 코딩으로 발생하는 예외
| 확인 시점 | 처리 여부 | 오류발생원인 |
---|
CheckedException | 컴파일시 | 반드시 예외처리 | 사용자의 잘못된 사용 |
RuntimeException | 런타임시 | 명시적으로 하지 않아도 Ok | 개발자의 코딩실수 |
예외처리하기
try-catch문 사용
try{
A 예외발생이 예상되는 수행문;
B 수행문;
} catch(예외클래스타입 변수명) {
C 예외발생시 수행문;
} catch(Exception 변수명){
D 수행문;
}
- 예외 발생 시: A👉C
- 예외가 발생하지 않을 시: A👉B👉D
- 발생한 예외의 종류와 일치하는 단 한개의 catch블럭만 실행
- try블럭 내에서 예외가 발생하지 않으면 try-catch문을 빠져나감
- Exception클래스는 모든 예외클래스의 부모이므로, C를 빠져나가더라도 D에 의해 처리됨
멀티 catch블럭
try{
...
} catch (Exception A | Exception B e) {
e.getMessage();
}
- 여러 catch블럭을 | 를 이용하여 합칠 수 있음
- Exception이 상속관계일 경우 부모클래스만 작성
- 두 Exception의 공통메서드만 선언 할 수 있음
printStackTrace(), getMessage()
- 예외클래스는 printStackTrace(), getMessage() 메서드를 포함하고 있음
- 이 메서드를 이용해서 예외내용 출력 가능
try{
System.out.println(1); // 정상출력
System.out.println(0/0); // 예외발생
System.out.println(2); // 출력되지 않고 catch로 넘어감
} catch ( Exception a) {
a.printStackTrace();
// 출력값: java.lang.ArithmeticException: / by zero
at MyClass.Product.main(Product.java:10)
System.out.println(a.getMessage());
// 출력값: / by zero
}
예외강제발생
- throw키워드로 예외를 강제로 발생시킬 수 있음
try {
Exception e = new Exception("강제발생");
throw e;
// 혹은 throw new Exception("강제발생");
} catch (Exception e) {
System.out.println("메세지: " + e.getMessage());
// 출력값 -> 메세지: 강제발생
}
- 예외 강제발생을 사용 할 때
- 업무로직 위배 ex)아이디 중복, 비밀번호 틀림, 출금금액이 잔액보다 많을 때 등
- 유효한 입력값이 아닐때 ex) 틀린 이메일 형식, 범위를 넘어가는 값 등
메서드 예외선언
- 메서드에 예외 선언/처리 가능
- 메서드 선언부에 throw를 사용해서 예외 작성
void method() throws Exception1, Exception2{
// 메서드 내용
}
- 키워드 주의 할 것👉throws: 예외메서드 / throw: 예외강제발생
사용자 정의 예외
- 기존 정의된 예외 클래스 외 새로운 예외클래스 사용 가능
- 보통 Exception이나 RuntimeException을 상속받아 클래스 생성
class MyException extends Exception{
MyException(String msg){}
}
public class A {
public static void main(String[]args) throws MyException{
int x = 10;
if (x<20) {
throw new MyException("사용자 정의 예외");
}
}
}