[JAVA] 예외 처리 (1)

DongGyu Jung·2022년 2월 4일
0

자바(JAVA)

목록 보기
20/60
post-thumbnail

🏃‍♂️ 들어가기 앞서..

본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 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에 대한 내용
    }
    ...
}

0개의 댓글