🏃♂️ 들어가기 앞서..
본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 Page : 〔투 비 마스터 : 자바〕
*해당 교재의 목차 순서와 구성을 참고하여 작성하며
각 내용마다 부족할 수 있는 내용이나 개인적으로 궁금한 점은
추가적인 검색을 통해 채워나갈 예정입니다.
자바에는 참 고마운 존재인 " 컴파일러 "가 있다.
컴파일러는
[ 구문 체크 / 번역 / 최적화 ] 역할을 수행한다.
이 컴파일러가 소스 코드(*.java
)를 컴파일 하면
앞서 설명했듯이
소스코드의 오타나 잘못된 구문, 자료형 검사 등의
기본적인 검사를 수행해서 오류가 있는지 없는지 알려준다.
컴파일러가 알려준 에러들을 잘 수정해서 성공적으로 컴파일이되면
그제서야 클래스 파일(*.class
)이 생성되고 이 클래스를 실행할 수 있다.
하지만 컴파일러가
실행 도중에 발생할 수 있는 잠재적인 오류까지 검사할 순 없기 때문에
의도치 않게 잘못된 결과를 얻거나 비정상적으로 종료될 수 있다
Error
)컴파일 에러 ( compile-time error )
: 말 그대로 컴파일 할때 발생하는 에러
런타임 에러 ( runtime error )
: 프로그램 실행 도중에 발생하는 에러
런타임 에러 방지를 위해선
실행 도중 발생할 수 있는 모든 경우의 수를 고려해서 대비해야 한다.
※ 런타임 발생 프로그램 오류
* 에러 (error) :코드에 의해 수습될 수 없는 심각한 오류
( 메모리 부족_OOME : OutOfMemoryError / 스택오버플로 : StackOverflowError)
* ★ 예외(exception) : 코드에 의해 수습 가능한 비교적 약한 오류
논리적 에러 ( logical error )
: 컴파일&실행에 문제가 없지만 의도하지 않게 동작하는 것
try ~ catch
문※ 구조
try { // 예외 검사 대상 실행문 } catch (Exception1 e1) { // Exception 1이 발생했을 때 → 처리문 } catch (Exception2 e2) { // Exception 2이 발생했을 때 → 처리문 } catch (Exception3 e3) { // Exception 3이 발생했을 때 → 처리문 }
* 만약 실제 발생 예외와 일치하는 예외처리문이 없을 경우 처리되지 않는다.
" 예외가 발생하지 않는 경우 ",
catch블럭은 실행되지 않고
try블럭이 문제없이 실행되고 빠져나간다.
하지만 만약
try블럭 내에 작성된 실행문 중
앞선 문장에서 예외가 발생되면
이후 문장들은 실행되지 않는다.
Exception클래스가 최고 조상 클래스이기 때문에
물론
세부적으로 예외처리를 해주는 것이 정확하지만
catch (Exception ~)
으로 모든 예외 처리가 가능하다.
✔
printStackTrace()
와getMessage()
예외가 발생하게 되어 생성되는 예외 클래스 인스턴스에는
발생 예외에 대한 정보가 담기는데
아래 메서드들을 통해 정보를 얻을 수 있다.
◎ 방식 :(참조형 매개변수).메서드();
printStackTrace()
: (예외발생 당시) 호출스택에 있던 메서드 정보와 예외 메시지를 화면에 출력
getMessage()
: 발생 예외 클래스의 인스턴스에 저장된 메세지 출력
catch
블럭(JDK1.7~)
내용이 같은 catch블럭을 "|
"을 이용해 하나로 합친 것
try {
...
} catch (Exception1 e1) {
e1.printStackTrace() ;
} catch (Exception2 e2) {
e2.printStackTrace() ;
}
/*
멀티 catch 블럭을 사용하게 된다면
*/
try {
...
} catch (Exception1 | Exception2 e) {
e.printStackTrace() ;
}
연결할 수 있는 예외 클래스 개수에는 제한이 없다.
주의할 점은,
연결된 2개 이상의 예외 클래스가
" 조상 - 자손 관계 "이면 컴파일 에러가 발생한다.
사실 조상 클래스만 써주더라도
모든 처리가 가능한데 불필요한 작성인 것이다.
앞서 설명했듯
개수에 제한이 없기 때문에
예외를 이 멀티 catch블럭으로 처리하게 되면
" 블럭 내에서 어떤 예외가 발생하는지 알 수 없다. "
그렇기 때문에
이 블럭 내에선 특정 클래스만 가진 멤버를 호출할 수 없고
" 조건문으로 분리 "해서 다루거나
" 공통 분모인 조상 예외 클래스 멤버만 " 사용해야 한다.
try {
...
} catch (Exception1 | Exception2 e) {
// 어떤 예외가 발생했는지 불확실
// Exception1에 선언되어있는 method1 은 호출 불가
// e.method1();
if (e instanceof Exception1) {
Exception1 e1 = (Exception1)e ; // 형변환
e1.method1() ; // 이경우엔 가능하다.
}else{
// Exception2에 대한 내용
}
...
}