1. 예외처리(exception handling)
1-1 프로그램 오류
컴파일 에러 - 컴파일 시에 발생하는 에러
런타임 에러 - 실행 시에 발생하는 에러
논리적 에러 - 실행은 되지만 의도와 다르게 동작하는 것
에러(error) - 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외(exception) - 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
1-2 예외 클래스의 계층구조
모든 예외의 최고 조상은 Exception 클래스이며, 상속계층도를 Exception클래스부터 도식화하면 다음과 같다.
Exception
└ IOException
└ ClassNotFoundException
└ ...
└ RuntimeException
└ ArtihmeticException
└ ClassCastException
└ ...
└ IndexOutOfBoundsException
Exception 클래스들 - 사용자의 실수와 같은 외적인 요인에 의해 발생하는 에외 (checked)
RuntimeException 클래스들 - 프로그래머의 실수로 발생되는 예외 (unchecked)
1-3 예외 처리하기 - try-catch문
예외처리(exception handling)의
정의 - 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것
목적 - 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것
try-catch문의 구조
try{
//예외가 발생할 가능성이 있는 문장들
} catch (Exception1 e1) {
//예외 발생시 처리를 위한 문장
} catch (Exception2 e2) {
//처리 문장
}
1-4 try-catch문에서의 흐름
try블럭 내에서 예외가 발생한 경우
1.발생한 예외와 일치하는 catch블럭이 있는지 확인한다.
2.일치하는 catch블럭을 찾게 되면 그 catch블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가 그 다음 문장을 계속 수행한다. 만일 일치하는 catch블럭을 찾지 못하면, 예외는 처리되지 못한다.
try블럭 내에서 예외가 발생하지 않은 경우
1.catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속한다.
1-5 예외의 발생과 catch블럭
모든 예외 클래스는 Exception클래스의 자손이므로, catch블록의 괄호()에 Exception클래스 타입의 참조변수를 선언해 놓으면 어떤 종류의 예외가 발생하더라도 이 catch블럭에 의해 처리된다.
만일 첫 번째 블럭에서 예외가 발생하면 두 번째 블럭은 검사하지 않게 된다.
printStackTrace()와 getMessage()
printStackTrace() - 예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
getMessage() - 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
멀티 catch블럭
JDK 1.7부터 여러 catch 블럭을 ' | '기호를 이용해 하나의 catch블럭으로 합칠수 있게 되었으며, 이를 '멀티 catch블럭'이라 한다.
ex)
try{ ...
} catch (ExceptionA | ExceptionB e) {
e.printStackTrace();
}
만일 ' | ' 기호로 연결된 예외 클래스가 조상과 자손의 관계에 있다면 컴파일 에러가 발생한다.
그러한 표현이 조상 하나만 써주는것과 다를 바 없기 때문이다.
1-6 예외 발생시키기
키워드 throw를 이용해 고의로 예외를 발생시킬 수 있으며, 방법은 아래의 순서를 따른다.
1. 먼저 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음
Exception e = new Exception("고의로 발생시켰음");
2. 키워드 throw를 이용해서 예외를 발생시킨다.
throw e;
1-7 메서드에 예외 선언하기
예외를 처리하는 방법에는 try-catch문 외에 예외를 메서드에 선언하는 방법이 있다.
메서드에 예외를 선언하려면 메서드의 선언부에 키워드 throws를 사용한다. 여러개일 경우 쉼표로 구분한다.
void method() throws Exception1, Exception2, ... ExceptionN{
// 메서드의 내용
}
1-8 finally블럭
finally블럭은 try-catch문과 함께 예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킨다.
try-catch-finally순서로 구성된다.
try { //예외 발생 가능성이 있는 문장
} catch (Exception1 e1) { //예외처리를 위한 문장
} finally { //예외의 발생여부에 상관없이 수행되어야만 하는 문장
}
1-9 자동자원 반환 -try-with-resouces문
jdk1.7부터 추가되었다. try-catch문의 변형이다.
1-10 사용자정의 예외 만들기
기존에 정의된 예외 클래스 외에 필요에 따라 새로운 예외 클래스를 정의하여 사용할 수 있다. 보통 Exception 클래스를 상속받지만, 필요에 따라 다른 예외 클래스도 선택할 수 있다.
1-11 예외 되던지기(exception re-throwing)
예외가 발생할 가능성이 있는 메서드에서 try-catch문을 사용해 예외를 처리해 주고 catch문에서 필요한 작업을 행한 후에 throw문을 사용해 예외를 다시 발생시킨다. 다시발생한 예외는 이 메서드를 호출한 메서드에게 전달되고 호출한 메서드의 try-catch문에서 예외를 또다시 처리한다.
하나의 예외에 대해서 예외가 발생한 메서드,호출한 메서드 양쪽 모두에서 처리해줘야 할 작업이 있을때 사용된다.
1-12 연결된 예외(chaind exception)
한 예외가 다른 예외를 발생시킬 수도 있다. 예를 들어 예외 A가 예외 B를 발생시켰다면, A를 B의 '원인 예외(cause exception)'라고 한다.
Throwable initCause (Throwable cause) // 지정한 예외를 원인 예외로 등록
Throwable getCause () // 원인 예외를 반환
RuntimeException (Throwable cause) // 원인예외를 등록하는 생성자
'java > 요약정리' 카테고리의 다른 글
자바의 정석 9장 (2) 유용한 클래스 (0) | 2018.07.10 |
---|---|
자바의 정석 9장 (1) java.lang패키지 (0) | 2018.07.09 |
자바의 정석 7장 (8) 내부 클래스(inner class) (0) | 2018.07.06 |
자바의 정석 7장 (7) 인터페이스(interface) (0) | 2018.07.06 |
자바의 정석 7장 (6) 추상클래스(abstract class) (0) | 2018.07.06 |