[Java] 예외처리

케이·2022년 10월 2일
0

JAVA

목록 보기
13/17

학습한 내용을 정리한 포스팅입니다. 참고 문헌 내용이 직역 되어 어색한 문장이 있을 수 있습니다. 틀린 내용이 있다면 지적해주시면 감사하겠습니다.🙇🏻‍♀️

Exception과 Error의 차이는?

에러와 예외는 다르다.

에러: 치명적이다 (발생하면 복구할 수 없다), 메모리 부족이나 스택 오버 플로우 등이 있다.

예외: 발생해도 수습할 수 있다.

예외에는 컴파일시 발생하는 컴파일 에러, 실행 시에 발생하는 런타임 에러 그리고 실행은 되지만 의도와 다르게 동작하는 논리적 에러가 있다.

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

자바의 예외는 크게 두가지로 나뉘는데

  1. Exception 클래스와 그 자손들
  2. RuntimeException 클래스와 그 자손들


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

RuntimeException 클래스들은 주로 프로그래머의 실수에 의해서 발생될 수 있는 예외들이다. 값이 null인 참조변수의 멤버를 호출한다든가, 배열의 범위를 벗어나는 것 같은 상황에서 발생한다. → Unchecked Exception -> 컴파일러가 예외처리를 확인하지 않음

이 외의 Exception 클래스들은 주로 외부의 영향으로 발생할 수 있는 것으로 프로그램 사용자들의 동작에 의해서 발생하는 경우가 많다. 예시로 존재하지 않는 파일의 이름을 입력한다든지, 입력한 데이터 형식이 잘못된 경우 발생한다. → Checked Exception -> 컴파일러가 예외처리를 확인함


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

자바에서의 예외처리는 try-catch문으로 처리한다. try 블럭에 실행할 문장을 넣고 해당 문장을 실행할 시 예외가 발생한다면 catch문에서 그 예외를 잡게 된다. 예외와 상관없이 꼭 실행될 문장은 finally에 넣는다.

예시

try {
		System.out.println("시작");
		start();
} catch (Exception e) {
		System.out.println("에러가 발생했습니다" + e.getMessage());
} finally {
		System.out.println("끝");
}

위의 순서대로라면 “시작”이 출력되고 start메서드가 실행된다.
이 때 예외가 발생하면 “에러가 발생했습니다” 라는 문구와 예외 메시지가 함께 출력되고 마지막으로 “끝”이 출력된다.
예외가 발생하지 않으면 바로 “끝”이 출력된다.

이 외에도 프로그래머가 일부러 예외를 발생 시킬 수 있는데 이 때 사용하는 것이 throw이다.

class Ex {
	public static void main(String[] args) {
		throw new Exception();
	}
}

throws는 메서드 내에서 발생하는 예외를 적어주기 위해 사용한다.

→ 메서드를 사용하려는 사람이 메서드를 사용하기 위해서 어떠한 예외들이 처리되어져야 하는지 쉽게 알 수 있다.

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

커스텀한 예외 만드는 방법

한 줄 요약: extends 해서 만든다.

예시)

class MyException extends Exception(){
		MyException(String msg){
				super(msg);	
		}
}

기존에는 주로 Exception을 상속 받아서 chekced 예외로 작성하는 경우가 많았지만 요즘에는 예외처리를 선택적으로 할 수 있도록 RuntimeException을 상속 받아서 작성한다고 한다. checked 예외 (위에서 잠깐 나옴) 는 반드시 예외 처리를 해주어야 하기 때문에 예외 처리가 불필요한 경우에도 try-catch을 넣어서 코드가 복잡해지기 때문이다.

실제로도 팀프로젝트에서 런타임 예외를 상속받아 커스텀 예외들을 만들어서 사용했었다. ExceptionHandler를 하나 생성해 각각 커스텀한 예외가 발생했을때 에러코드와 메시지를 리턴할 수 있도록 했다.

예시) UserNotFoundException

위의 예외가 포함되어 있는 ExceptionHandler


참고

  • 남궁성, 자바의 정석
  • 오라클 공식 문서
profile
삽질하며 깨닫고 배웁니다. (a.k.a 프로삽질러) + 이 구역의 회고왕

0개의 댓글