목표
자바의 예외 처리에 대해 학습하세요.
학습할 것 (필수)
- 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
- 자바가 제공하는 예외 계층 구조
- Exception과 Error의 차이는?
- RuntimeException과 RE가 아닌 것의 차이는?
- 커스텀한 예외 만드는 방법
개발자의 고통... 그 이름 '에러'
개발을 하는데 에러는 언제든지 나타난다
에러가 발생하면 프로그램은 작동 불능이 되지만
에러가 발생해도 정상적인 상태가 유지하도록 만드는게 예외처리이다
자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
예외 처리는 try-catch 구문을 이용하며 다음과 같다
// 에외 처리용 try-catch 구문
try {
// 예외 발생 가능 코드를 적는다
} catch (Exception e) {
// 에러가 발생하면 실행할 코드
}
try 구문 안에는 잠재적인 에러 유발 코드를 적는다
catch 구문 안에는 에러가 발생 시 실행한 예외처리 코드를 적는다
catch 는 예외 클래스에 따라 다중으로 선언할 수 있다
try {
// 예외 발생 가능 코드를 적는다
....
} catch (NullPointerException e) {
// null 에러가 발생
....
} catch (ArrayIndexOutOfBoundsException e) {
// 배열 크기 관련 에러 발생
....
} catch (Exception e) {
// 에러가 발생하면 실행할 코드
....
}
다중으로 선언된 catch 는 try 구문내에서 발생한 에러에 따라 한개만 실행되며
예외 여부에 상관없이 실행할 내용이 있을 경우엔 finally 구문을 마지막에 추가해준다
실행할 내용이 없을 시 생략이 가능하다
try {
// 예외 발생 가능 코드를 적는다
....
} catch (NullPointerException e) {
System.out.println("null 에러가 발생");
} finally {
// 예외에 상관없이 항상 실행이 되는 코드
System.out.println("무조건 실행이 된다");
}
개발 중 특정 상황에 따라 강제적으로 예외를 발생할 경우가 존재한다 (ex:주문 시 수량제한)
그럴 경우 throw new 예외클래스("메시지") 입력으로 발생한다
try {
throw new Exception("예외 발생 시킴");
} catch (Exception e) {
// 에러가 발생하면 실행할 코드
System.out.println(e.getMessage());
}
throw new 예외클래스("메시지") 입력으로 실행된다
개발을 하다보면 예외가 발생할 수 있는 코드를 try-catch 블록안에 처리하지만 상황에 따라 메소드를 호출하는 곳으로 예외를 떠넘길 수도 있다
이 때 사용하는게 throws 키워드이다. 메소드 선언부 끝에 작성한다. 다음과 같은 형태를 가진다.
public static boolean checkOrderQuantity() throws Exception, NullPointerException {
.....
}
, 를 이용해서 예외를 여러가지 붙일 수 있다 throws 예외클래스1, 예외클래스2, ...
throws Exception 하나만으로 모든 예외를 간단히 넘길수도 있다
메서드에 throws 를 붙이면 메서드를 사용하는 사람이 예외처리를 해야한다 예외 책임을 떠넘기는 거다
자바가 제공하는 예외 계층 구조
예외 계층 구조 그림이다.
Exception과 Error의 차이는?
위의 그림을 보면 크게 2가지로 나눠지는걸 볼 수 있다.
에러(Error)는 시스템 레벨에 발생하는 것으로 개발자가 예측할 수 없는 상황이다
예외(Exception)는 사용자가 잘못 사용하거나 개발자가 작성한 코드에서 발생하는 것으로 예측이 가능하며 예외처리로 프로그램을 정상적으로 작동하게 처리할 수 있다
RuntimeException과 RE가 아닌 것의 차이는?
위의 그림에서 예외(Exception)를 상속받는
Unchecked Exception 영역의 RuntimeException와
Checked Exception 영역의 나머지 자식 클래스로 구분되어있다
Unchecked Exception는 프로그램이 실행 도중 발생하는 개발자의 실수로 생기는 에러다. 개발을 하면서 예외가 발생안하게 주의하는게 좋다
Checked Exception는 컴파일러가 예외처리 여부를 확인한다. 주로 심각한 에러 발생 가능성을 체크하며 반드시 try-catch 구문을 사용하게 잡는다.
다음은 Unchecked Exception 의 일부분이다
- NullPointerException : null 값을 갖는 참조변수를 접근 연산자 사용했을 때 발생.
- IndexOutOfBoundsException : 인덱스 범위 초과하여 사용발생.
- NumberFormatException : 문자를 숫자로 바꿀 수 바뀌지 못하면 발생
- OutOfMemoryException : 메모리가 부족한 경우 발생
다음은 Checked Exception 의 일부분이다
- IOException : 입력/출력 실패 시 발생
- SQLException : SQL 에러가 생기면 발생
- ClassNotFoundException : 클래스가 없는 경우 발생
커스텀한 예외 만드는 방법
커스텀 예외를 만드는 방법은 단순하다 Exception 을 상속받으면 된다.
Exception 의 자식 중(RuntimeException, NullPointerException)에서 특정상황에 맞는 예외를 상속받아 커스터마이징해도 된다
// 커스텀 예외 만드는 방법, 예외(Exception)를 상속받아 사용한다.
public class MyCustomException extends RuntimeException {
public MyCustomException() {
super();
}
// 메시지
public MyCustomException(String message) {
super(message);
}
// 메시지, 원인
public MyCustomException(String message, Throwable cause) {
super(message, cause);
}
}
public static void main(String[] args) {
try {
throw new MyCustomException("예외 발생");
} catch (MyCustomException e) {
System.out.println(e.getMessage());
System.out.println(e.getCause());
} catch (NullPointerException e) {
// 널에러가 발생해도 새로운 예외로 넘길 수 있다, NullPointerException도 보내는게 베스트 프랙티스다
throw new MyCustomException("널 예외 발생", e);
}
}
이것이자바다, 신용권 [한빛미디어]
예외계층그림 www.nextree.co.kr/p3239/ [넥스트리소프트]
'개발 & 방법론 > Java' 카테고리의 다른 글
11주차 과제 : enum (0) | 2021.02.18 |
---|---|
10주차 과제 : 멀티쓰레드 프로그래밍 (0) | 2021.02.18 |
자바 8주차 : 인터페이스 (0) | 2021.02.13 |
7주차 : 패키지 (0) | 2021.01.01 |
6주차 : 상속 (0) | 2020.12.30 |