[자바의 정석] 예외 처리

YJS·2023년 12월 2일
0

1. 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)


에러의 종류

-컴파일 에러: 컴파일 시에 발생하는 에러

-런타임 에러: 실행 시에 발생하는 에러

-논리적 에러: 실행은 되지만 의도와 다르게 동작

  1. try-catch문
try {
//예외 발생 가능성 있는 문장들
} catch (Exception e1)
{
// Exception e1이 발생했을 경우 처리할 문장
} catch (Exception2 e2)
{
// Exception e1이 발생했을 경우 처리할 문장
} catch (ExceptionN eN)
{
// Exception e1이 발생했을 경우 처리할 문장
}

// try 블럭이나 catch 블럭에서는 문장이 한줄이어도 괄호 생략 불가.

//try 블럭이나 catch 블럭 내에 또다른 try-catch 구문 사용 가능.

// 발생한 예외와 일치하는 catch 블럭으로 이동해서 문장 수행하고 try-catch구문 빠져나가서
//그 다음 문장 수행. 일치하는 catch 가 없다면 예외 처리 이루어지지 않음.

// try-catch 마지막에 exception클래스 타입의 참조변수를 선언한 catch 블럭 만들면
// 어떤 종류의 예외가 발생하더라도 해당 catch 문으로 처리가능

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

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

  1. throw/ throws문

메서드에 예외 선언하려면 메서드 선언부에 키워드 throws 사용해서 발생 가능한 예외를 , 기준으로 나열.

void method() throws Exception1, Exception2, Exception3{
//메서드 내용
} 

보통 반드시 처리해야하는 예외의 경우 나열(RuntimeException클래스들은 보통 적지 않음)

자신을 호출한 메서드에게 예외를 전달하여 떠맡기는 형식으로 전달받은 메서드가 또다시 넘길 수 있음

이런식으로 계속 호출스택에 있는 메서드들 따라서 전달되다가 마지막에는 main에서 try-catch 문으로 예외처리해주어야 정상적으로 종료 가능.

  1. finally 블럭

try-catch 문과 함께 예외의 발생 여부에 상관없이 실행되어야할 코드를 포함시킬 목적으로 사용.

try {
//예외 발생 가능성 있는 문장들
} catch (Exception e1)
{
// Exception e1이 발생했을 경우 처리할 문장
} finally{
//예외 밟생 여부에 관계없이 수행되어야하는 문장
}

try블럭 혹은 catch블럭에서 예외가 발생하거나 return하는 경우에도 finally 블럭에 있는 문장들을 시행시키고 프로그램 종료됨.

2. 자바가 제공하는 예외 계층 구조


출처: 자바의 정석 3판 415p

→ 모든 예외의 최고 조상은 exception클래스

출처: 자바의 정석 3판 415p

→ Exception 클래스들: 사용자의 실수와 같은 외적 요인에 의해 발생하는 예외

e.g. FileNotFoundException : 존재하지 않는 파일의 이름 입력

ClassNotFoundException: 클래스 이름 잘못 입력

DataFormatException: 입력한 데이터 형식의 오류

→Runtime Exception클래스들: 프로그래머의 실수

e.g. IndexOutOfBoundException: 배열의 범위를 멋어남

NullPointerException: 값이 null인 참조변수의 멤버를 호출

ClassCastException: 클래스간의 형변환 오류

ArthimeticException: 정수를 0으로 나누려함

3. Exception과 Error의 차이는?


에러(error) vs 예외(exception)

-에러: 메모리 부족이나 스택오버플로우와 같은 코드로 수습 불가능한 심각한 오류

-예외: 프로그램 코드로 수습될 수 있는 다소 미약한 오류

4. RuntimeException과 RE가 아닌 것의 차이는?


RE란?

말 그대로 실행 중에 발생하며 시스템 환경적으로나 인풋 값이 잘못된 경우, 혹은 의도적으로 프로그래머가 잡아내기 위한 조건등에 부합할 때 발생

→RuntimeException을 상속받지 않고 Exception을 상속받는 모든 Exception은 Checked Exception

unchecked예외: 컴파일러가 예외처리를 확인하지 않는 RuntimeException클래스들

checked예외: 예외처리를 확인하는 클래스들

5. 커스텀한 예외 만드는 방법


class MyException extends Exception{
		MyException(String msg) {
			super(msg); // 조상인 Exception 클래스의 생성자 호출
		}
}

→ 보통 예외 처리 강제하지 않는 uncheked를 선호함.

profile
우당탕탕 개발 일기

0개의 댓글