Java

[자바의 정석] 8장 예외처리

woochii 2023. 7. 22. 20:17
728x90
반응형

1. 프로그램 오류

  • 컴파일 에러 : 컴파일 할 때 발생하는 에러
  • 런타임 에러 : 실행 할 때 발생하는 에러
  • 논리적 에러 : 작성 의도와 다르게 동작

 

자바의 런타임 에러

  • 에러 (error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
  • 예외 (exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
    --> 에러는 어쩔 수 없지만, 예외는 처리하자

예외처리의 정의와 목적

정의 : 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것

목적 : 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것

 

 

Exception과 RuntimeException

  • Exception 클래스와 그 자손
    • 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
  • RuntimeException 클래스와 그 자손
    • 프로그래머의 실수로 발생하는 예외

 

2. 예외 처리하기

2-1. try-catch 문

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문을 빠져나가서 수행을 계속한다.

 

2-2. printStackTrace()와 getMessage()

printStackTrace()
: 예외 발생 당시의 호출스택에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.

getMessage()
: 발생한 예외 클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.

 

2-3. 멀티 catch블럭

  • 내용이 같은 catch블럭을 하나로 합친 것
try {
    ...   
} catch (ExceptionA | ExceptionB e) {
    e.printStackTrace();
}

 

 

3. 예외 발생시키기

3-1. 예외 발생시키기

  • 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음
  • 키워드 throw를 이용해서 예외를 발생시킨다.
Exception e = new Exception("고의로 발생시킴");  //연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음

throw e;  //키워드 throw를 이용해서 예외를 발생시킨다.

 

3-2. checked 예외, unchecked 예외

checked 예외 : 컴파일러가 예외 처리 여부를 체크 (예외 처리 필수)
(checked 예외 -> Exception과 자손)

unchecked 예외 : 컴파일러가 예외 처리 여부를 체크 안함 (예외 처리 선택)
(unchecked 예외 -> RuntimeException과 자손)

 

3-3. 메서드에 예외 선언하기

  • 예외를 처리하는 방법
    1. try-catch 문
    2. 예외 선언하기 (예외 떠넘기기, 알리기)
    3. 은폐
  • 메서드가 호출 시 발생 가능한 예외를 호출하는 쪽에 알리는 것
void method() throws Exception1, Exception2, ... ExceptionN {
	// 메서드의 내용
}

// method()에서 Exception과 그 자손 예외 발생 가능
void method() throws Exception {
	// 메서드의 내용
}

 

3-4. finally 블럭

  • 예외 발생 여부와 관계 없이 반드시 수행되어야 하는 코드
try {
    // 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch (Exception1 e1) {
    // 예외처리를 위한 문장을 적는다
} finally {
    // 예외의 발생 여부에 관계없이 항상 수행되어야 하는 문장들을 넣는다.
    // finally블럭은 try-catch문의 맨 마지막에 위치해야 한다.
}
  • 참고 : try블럭 안에 return문이 있어서 try블럭을 벗어나갈 때도 finally블럭이 실행된다.

 

3-5. 사용자 정의 예외 만들기

  • 우리가 직접 예외 클래스를 정의할 수 있다.
  • 조상은 Exception과 RuntimeException중에서 선택

 

3-6. 예외 되던지기 (exception re-throwing)

  • 예외를 처리한 후에 다시 예외를 발생시키는 것
  • 호출한 메서드와 호출된 메서드 양쪽 모드에서 예외처리하는 것
public static void main(String args[]) {
    try {
        method1();
    } catch (Exception e) {
        System.out.println("main메서드에서 예외가 처리되었습니다.");
    }
} // main메서드의 끝

static void method1() throws Exception {
    try {
        throw new Exception();
    } catch (Exception e) {
        System.out.println("method1메서드에서 예외가 처리되었습니다.");
        throw e;  // 다시 예외를 발생시킨다.
    }
} // method1메서드 끝

 

 

3-7. 연결된 예외(chained exception)

  • 한 예외가 다른 예외를 발생시킬 수 있다.
  • 예외 A가 예외 B를 발생시키면, A는 B의 원인 예외(cause exception)
Throwable initCause(Throwable cause) : 지정된 예외를 원인 예외로 등록

Throwable getCause() : 원인 예외를 반환

 

  • 이유
    1. 여러 예외를 하나로 묶어서 다루기 위해서
    2. checked예외를 unchecked예외로 변경하려 할 때

References

https://github.com/castello/javajungsuk_basic

 

GitHub - castello/javajungsuk_basic: 자바의 정석 기초편 관련 자료입니다.

자바의 정석 기초편 관련 자료입니다. Contribute to castello/javajungsuk_basic development by creating an account on GitHub.

 

728x90
반응형