[JAVA] 예외 처리 ( Exception, Throws, 커스텀 Exception )
Exception
- 프로그램 실행 중 예기치 못한 사건을 예외라고 하는데, 예외 상황을 미리 예측하고 처리하는 방식을 예외처리라고 함.
try - catch - finally 구문
- 자바스크립트에서도 동일한 방식으로 예외처리를 할 수 있음
try {
// 수행할 코드
// 예외 발생 가능성이 있는 블록
} catch (예외 클래스 변수명) {
// 예외 처리 블록
} finally {
// 예외 발생 여부와 상관없이 반드시 실행되는 블록
}
try
- 예기치 못한 사건이 발생할 수 있는 구문
catch
- 예기치 못한 사건이 발생했을 때 동작하는 구문
finally
- 사건이 발생하든 발생하지 않든 동작하는 구문
예시 코드
public class excceptionExam {
public static void main(String[] args) {
int i = 10;
int j = 0;
try {
int k = i/j;
System.out.println(k);
} catch (ArithmeticException e){
System.out.println("0으로 나눌 수 없습니다." + e.toString());
} finally {
System.out.println("계산 종료");
}
}
}
- 에러가 발생하지 않는 경우
- 에러가 발생한 경우
- 코드에서 보다시피 분모가 0으로 나눴을 때 이후, 즉 에러가 발생한 부분 이후는 출력되지 않고 catch 구문이 동작함.
- finally 구문은 에러 발생 여부와 상관없이 동작
- catch 구문에서는 예상할 수 있는 에러의 타입을 명확하게 명시해야 제대로 동작함.
Throws
- 메소드에서 예외가 발생했을 때, 예외를 호출한 쪽에서 예외를 사용할 수 있도록 전달하는 역할
public class ExceptionExam2 {
public static void main(String[] args) {
int a = 10;
int b = 0;
try {
int k = divide(a, b);
System.out.println(k);
} catch (ArithmeticException e){
System.out.println("0으로 나눌수 없습니다.");
} catch (IllegalArgumentException e){
System.out.println(e);
}
}
public static int divide(int a, int b) throws ArithmeticException, IllegalArgumentException {
int k = a/b;
return k;
}
}

- 메소드 옆에 throws를 이용해서 전달 할 수 있는 예외를 명시해서 메소드를 호출한 쪽에서 처리하도록 만들 수 있음.
Exception 발생 시키기 ( 강제 에러 처리 )
- 강제로 오류를 발생시켜서 예외를 전달하도록 만듬
public class ExceptionExam2 {
public static void main(String[] args) {
int a = 10;
int b = 0;
try {
int k = divide(a, b);
System.out.println(k);
} catch (ArithmeticException e){
System.out.println("0으로 나눌수 없습니다.");
} catch (IllegalArgumentException e){
System.out.println(e);
}
}
public static int divide(int a, int b) throws ArithmeticException, IllegalArgumentException {
if (b == 0) {
throw new IllegalArgumentException("분모가 0일 수 없습니다.");
}
int k = a/b;
return k;
}
}

- throws 와 동일한 메소드에 throw 를 통해서 exception을 생성하여 전달함.
- 자바스크립트에서도 비슷한 방식으로 에러 전달 가능
throw new Error();
- 메소드가 예상하지 못한 방식으로 동작 할 수 있기 때문에 특정 조건일 때 예외를 발생시켜서 제어할 수 있음.
커스텀 Exception
- Checked Exception을 사용하고 싶은 경우 Exception을 상속
- 반드시 오류를 처리해야 하는 Exception
- 예외 처리를 하지 않으면 컴파일 오류 발생
- Unchecked Exception을 사용하고 싶은 경우 RuntimeException을 상속
- 예외 처리를 하지 않아도 컴파일 시에 오류를 발생시키지 않음.
// BizException.java
public class BizException extends RuntimeException {
public BizException(String msg){
super(msg);
}
public BizException(Exception ex){
super(ex);
}
}
- Exception을 상속받아서 커스텀 Exception을 만들 수 있음.
- 생성자의 매개변수를 super로 부모의 생성자로 전달하여 사용함
// BizService.java
public class BizService {
public void bizMethod(int i) throws BizException{
System.out.println("비즈니스 메소드 시작");
if (i < 0){
throw new BizException("0보다 작습니다.");
}
System.out.println("비즈니스 메소드 끝");
}
}
- 커스텀 Exception을 전달하는 메소드 생성
// BizExam.java
public class BizExam {
public static void main(String[] args) {
BizService biz = new BizService();
try {
biz.bizMethod(5);
biz.bizMethod(-3);
} catch (BizException e) {
System.out.println(e.getMessage());
}
}
}
- 커스텀 Exception을 사용하는 메소드를 호출하여 사용
- 매개변수로 5를 전달 받은 메소드는 정상적으로 동작
- 매개변수로 -3을 전달 받은 메소드는 throw를 통해 에러를 전달받아서 동작하는 것을 확인 할 수 있음.