컴파일 에러 : 컴파일 시에 발생하는 에러
런타임 에러 : 실행 시에 발생하는 에러
논리적 에러 : 실행은 되지만, 의도와 다르게 동작하는 것
Exception과 Error를 클래스로 정의한 것
RuntimeException : 주로 프로그래머의 실수에 의해서 발생될 수 있는 예외들로 자바의 프로그래밍 요소들과 관계가 깊음
ex)배열의 범위를 벗어난다던가(ArraylndexOutOfBoundsException), 값이 null인 참조변수의 멤버를 호줄하려 했다던가 (NullPointerException), 클래스간의 형변환을 잘못했다던가(ClassCastException), 정수를 0으로 나누려고(ArithmeticException)하는 경우
예외처리 (exception handling) 의
정의 - 프로그램 실행 시 발생할 수 있는 예외에 대비한 코드를 작성하는 것
목적 - 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것
try { // 중괄호({}) 생략 불가능
// 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch (Exceptionl el) {
// Exception1이 발생했을 경우,이를 처리하기 위한 문장을 적는다.
} catch (Exception2 e2) {
// Exception2이 발생했을 경우,이를 처리하기 위한 문장을 적는다.
} catch (ExceptionN eN) {
//ExceptionN이 발생했을 경우,이를 처리하기 위한 문장을 적는다.
}
이 중 발생한 예외의 종류와 일치하는 단 한 개의 catch블럭만 수행되고 발생한 예외의 종류와 일치하는 catch블럭이 없으면 예외는 처리되지 않음
try블럭 내에서 예외가 발생한 경우,
try블럭 내에서 예외가 발생하지 않은 경우,
예외가 발생시) 발생한 예외에 해당하는 클래스의 인스턴스가 만들어짐
-> catch블럭부터 차례로 내려가면서 catch블럭의 괄호()내에 선언된 참조변수의 종류와 생성된 예외클래스의 인스턴스에 instanceof 연산자를 이용해서 검사
모든 예외 클래스는 Exception클래스의 자손
-> catch블럭의 괄호()에 Exception클래스 타입의 참조변수를 선언해 놓으면 어떤 종류의 예외가 발생하더라도 이 catch블럭에 의해서 처리된다.
-> try-catch문의 마지막에 Exception클래스 타입의 참조변수를 선언한 catch블럭을 사용하면, 어떤 종류의 예외가 발생하더라도 이 catch블럭에 의해 처리되도록 할 수 있다.
printStackTrace()
: 예외발생 당시의 호출스택 (Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력
getMessage()
: 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있음
여러 catch블릭을 ‘|’기호로 합친 것
try {
...
} catch (ExceptionA | ExceptionB e) {
e.printstackTrace();
}
try {
...
} catch (ExceptionA | ExceptionB e) {
e.methodA();// 에러.ExceptionA에 선언된 methodA()는호출불가
...
Exception e = newException("테스트");
getMessage()
를 이용해 얻을 수 있음throw e;
예외를 발생시키는 키워드 : throw
예외를 메서드에 선언 : throws
void method() throws Exception1, Exception2, ... Exceptions {
// 메서드의 내용
}
예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킬 목적으로 사용
(try블럭에서 return문을 만나도 finally 블럭의 문장은 수행함)
try-catch-finally
주로 입출력(I/O)과 관련된 클래스를 사용할 때 유용 : 사용한 후에 꼭 닫아서 자원을 반환해야 하는 경우
try {
fis = new FileInputStream(nscore.dat");
dis = new DatalnputStream(fis);
} catch (IOException ie) {
ie.printStackTrace();
} finally {
try {
if (dis! =null)
dis.close();
} catch(IOException ie){
ie.printstackTrace(》;
}
}
🚨 finally 블럭 안에 try-catch 문
:코드가 복잡, try블럭과 finally블럭에서 모두 예외가 발생하면 try블럭의 예외는 무시됨
=> try-with-resources문 : try-with-resources문의 괄호()안에 객체를 생성
try(객체 생성 코드){
...
} catch (exception){
...
AutoCloseable
인터페이스를 구현suppressed
(억제된) 예외로 출력됨void addSuppressed (Throwable exception)
: 억제된 예외를 추가Throwable[] getSuppressed()
: 억제된 예외 (배열)를 반환checked 예외
(처리를 강제)로 작성하는 경우가 많았음unchecked 예외
선호예외를 처리한 후에 인위적으로 다시 발생시키는 방법
-> 예외가 발생한 메서드와 호출한 메서드 양쪽에서 처리할 수 있도록 함
(양쪽 모두 에서 처리해줘야 할 작업이 있을 때 사용)
한 예외가 다른 예외를 발생시키는 경우
ex. 예외 A -> 예외 B 발생 : A를 B의 '원인 예외(cause exception)' 이라고 함
Throwable initCause(Throwable cause)
: 지정한 예외를 원인 예외로 등록Throwable getCause()
: 원인 예외를 반환static void startlnstall() throws SpaceException, MemoryException {
if(!enoughSpace()) // 충분한 설치 공간이 없으면...
throw new SpaceException("설치할 공간이 부족합니다.");
if (!enoughMemory()) // 충분한 메모리가 없으면...
throw new MemoryException(’’메모리가 부족합니다.");
}
⬇️
static void startlnstall() throws SpaceException{
if(!enoughSpace()) // 충분한 설치 공간이 없으면...
throw new SpaceException("설치할 공간이 부족합니다.");
if (!enoughMemory()) // 충분한 메모리가 없으면...
throw new RuntimeException(new MemoryException(’’메모리가 부족합니다."));
// RuntimeException (Throwable cause) : 원인 예외를 등록하는 생성자
}
RuntimeException으로 감싸버렸기 때문에 unchecked예외가 된 것
-> 더 이상 startlnstall()의 선언부에 MemoryException을 선언하지 않아도 됨