[Java] 에러처리 | Try-catch | 컴파일 오류, 런타임 오류, 논리 오류 | 예외처리 방법 | checked, unchecked exception | 예외 우선순위
Try-catch
프로그래밍 오류의 종류
컴파일 오류
: 프로그램의 실행을 막는 오류, 대부분 문법적인 오류다.
//1 (키워드 맞춤법 오류)
inet num = 1;
//2 (세미콜론 누락)
boolean a = false
//3 (endif문부터 사용)
end if(!a) {
return;
}
//4 (선언안된 변수 사용)
b = 3;
런타임 오류
: 프로그램 실행 중 발생하는 오류, 수행할 수 없는 작업 시도시 발생
1. 0으로 나누는 경우
2. 무한루프에 빠지는 경우
3. null point error
논리 오류
: 사용자가 의도한 작업을 프로그램에서 수행하지 못하는 오류, 예측 불가능한 오류
try-catch
정의 : 예외를 처리하기 위한 구문
예외처리 : 오류가 발생할 수 있는 부분을 예측한다. try블록에서 오류가 발생하면 catch로 처리하고 다른 조치를 취할 수 있다.
구조
try {
//예외발생 가능성이 있는 코드
} catch(Exception1 e) {
//Exception1 발생시 처리할 문장
} catch(Exception2 e2) {
//Exception2 발생시 처리할 문장
} finally {
//예외발생여부에 관계없이 수행되어야 하는 문장
}
finally문 → try에 return이 존재하더라도 finally 구문안에 있는 명령어는 반드시 실행한다.
흐름
예외가 try 블럭에서 발생한 경우
발생하는 예외와 일치하는 catch문이 있는지 확인
→ 있으면 catch블럭 내 문장 실행, 없으면 에러 발생(에러가 처리되지 못했기 때문)
예외메세지 얻는방법
- printStackTrace()
: 예외발생 당시의 call stack에 있던 메서드의 정보와 예외 메세지를 출력한다. - getMessage()기본적인 내용은 알 수 있지만 상세하진 않음
: 예외클래스의 인스턴스에 저장된 메세지를 얻을 수 있음
예외 던지기
throw e
: 개발자가 고의로 발생시키는 예외
try {
Exception e = new Exception("에러 발생");
throw e;
} catch(Exception e) {
System.out.println("메세지:" + e.getMessage());
e.printStackTrace();
}
예외 던지기
throw e
: 개발자가 고의로 발생시키는 예외
try {
Exception e = new Exception("에러 발생");
throw e;
} catch(Exception e) {
System.out.println("메세지:" + e.getMessage());
e.printStackTrace();
}
예외의 우선순위
예외는 상속을 통해 부모-자식 관계가 존재한다.
부모 예외가 위에 있으면 자식 예외는 발생할 수 없음.
Exception 은 ArithmeticException, ArrayIndexOutOfBoundsException의 조상이기 때문에 위에서 먼저 잡혀서 오류가 잡힐 수 없는 구조이기 때문에 에러가 발생한다.
ex) ArithmeticException의 상속관계
출처 : https://docs.oracle.com/javase/7/docs/api/java/lang/ArithmeticException.html
Checked Exception vs Unchecked Exception
checked exception :
- 컴파일러가 확인 후 문제가 발생할 것 같은 코드에 컴파일 에러를 발생
- 외부 요인에 의해 발생할 수 있는 Exception
- exception에서 runtime을 제외한 나머지 (ex)IOException : 파일에서 데이터를 읽고 쓸때 예외적인 상황 많이 발생)
IOException이 발생할 수 있으므로 반드시 예외처리를 해줘야한다는 에러 발생
- 반드시 예외에 대한 조치(throws, catch)를 통해 처리해줘야함
unchecked exception :
- RuntimeException을 상속하는 클래스
- 명시적인 예외처리를 강제하지는 않음(컴파일에러 발생 X)
- 내부 요인에 의해 발생할 수 있는 Exception
- 런타임에서 에러를 확인할 수 있기 때문에 컴파일 단계에서 미리 예외를 체크할 수 없다.
- ex) ArithmeticException, IndexOutOfBoundsException