
컴파일러 하는 일
1. 구문 체크
2. 번역
3. 최적화
런타임 에러
- 에러(error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
- 예외(exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
에러는 어쩔 수 없지만 예외는 미리 처리해보자
try {
// 예외가 발생할 가능성이 있는 문장을 넣는다.
}catch (Exception1 e1) {
// Exception1이 발생했을 경우 이를 처리하기 위한 문장을 찾는다.
}catch (Exception2 e2) {
// Exception2이 발생했을 경우 이를 처리하기 위한 문장을 찾는다.
}
....
}catch (ExceptionN eN) {
// ExceptionN이 발생했을 경우 이를 처리하기 위한 문장을 찾는다.
}
try블럭 내에서 예외가 발생할 경우
1) 발생한 예외와 일치하는 catch블럭이 있는지 확인
2) 일치하는 catch블럭을 찾게 되면, 그 catch블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행한다. 만일 일치하는 catch블럭을 찾지 못하면, 예외는 처리되지 못한다.
try블럭 내에서 예외가 발생하지 않는 경우
1) catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속한다.
try {
System.out.println(0/0); // 예외 발생!
}catch (ArithmeticException e1) {
System.out.println(e1.getMessage());
....
}catch (Exception eN) {
...
}
try{...
} catch(ExceptionA e){
e.printStackTrace();
} catch(ExceptionB e2){
e2.printStackTrace(); // 위에 catch블럭 내용 동일!!
}
try{...
} catch(ExceptionA | ExceptionB e){
e.printStackTrace();
}
❗주의
//경우1. try{... // } catch(ParentExceptionA | ChildException e){ //에러! } catch(ParentExceptionA e){ // 부모자식 관계일 땐 부모만 작성해주면 됨!! e.printStackTrace(); } //경우2. ```java try{... } catch(ExceptionA | ExceptionB e){ //e.methodA(); // 에러 : ExceptionA에 선언된 methodA()는 호출 불가! // instanceof 사용해 형변환 후 불러오는 건 가능! e.printStackTrace(); }
👀
내배캠 강의를 듣는데 예외처리 부분을 공부하기 시작했다. 이전 프로젝트 때 예외처리 지식이 부족해서 아쉬웠던 경험이 있다. 이번엔 그때 느낀 아쉬움을 다시 느끼고 싶지 않기 때문에 이 부분을 집중적으로 자세하게 공부해야겠다.