Exception을 통해 예외상황을 미리 예측하고 처리할 수 있다.
try-catch-finally
try{
}catch(Exception e){
}finally{
}
try
- 오류가 발생할 부분을 예측하고 try에 적어준다.
catch
- try블럭안에서 예외가 발생했을 때 실행시킬 코드를 catch에 적어준다.
finally
- 오류가 발생하던 안하던 무조건 실행시킨다. 생략이 가능하다.
Exception 종류, Exception원리, Exception하는 이유, Exception이유, custom Exception하는 이유
- try에서 오류가 발생하면 발생한 지점부터
try
블록 끝까지 실행되지 않고,catch
블록으로 이동한다. - 이때 발생한 예외가
catch
(예외클래스 변수명)의 '예외 클래스'와 같아야 catch블록이 실행된다.
throws
매서드를 호출시킨 곳으로 오류를 떠넘길 수 있다.
1. 오류발생
public class ExceptionExam2 {
public static void main(String[] args) {
int i = 10;
int j = 0;
int k = divide(i, j);
System.out.println(k);
}
public static int divide(int i, int j){
int k = i / j;
return k;
}
}
위 코드를 실행시키면 j가 0이기에 ArithmeticException
이 발생한다.
divide매서드 안에서 ArithmeticException
이 발생하지 않게 하기 위해서는 devide매서드 안에서 try~catch문으로 감싸야한다.
하지만 throws를 사용하면 devide에서 오류를 처리하지 않고 devide를 호출한 쪽에게 오류를 처리하라고 떠넘길 수 있다.
2. 처리
나를 호출한 쪽에서 처리하세요!
public class ExceptionExam2 {
public static void main(String[] args) {
int i = 10;
int j = 0;
try{
int k = divide(i, j);
System.out.println(k);
} catch(ArithmeticException e) {
System.out.println(e.toString());
}
}
public static int divide(int i, int j) throws ArithmeticException{
int k = i / j;
return k;
}
}
divide를 실행할 때, ArithmeticException
가 발생한다면, divide를 호출한 곳(main메서드)에서 오류가 발생한다.
main매서드 내 오류를 처리할 부분에 try~catch문을 적어주어야 한다.
throw
오류를 직접 발생시킬 수 있다.
오류를 떠넘기는 throws
와 같이 사용된다.
1. 오류 발생
public class ExceptionExam3 {
public static void main(String[] args) {
int i = 10;
int j = 0;
int k = divide(i, j);
System.out.println(k);
}
public static int divide(int i, int j){
if(j == 0){
throw new IllegalArgumentException("0으로 나눌 수 없습니다.")
}
int k = i / j;
return k;
}
}
오류가 발생하기 전에 if로 j가 0인지 확인한다.
참인 경우 IllegalArgumentException
을 새로 만들고 익셉션을 발생시킨다.
자바에는 여러 가지 익셉션이 이미 있고, 그걸 올바른 상황에 맞게 가져다 쓰면 된다.
2. 처리
public class ExceptionExam3 {
public static void main(String[] args) {
int i = 10;
int j = 0;
try{
int k = divide(i, j);
System.out.println(k);
} catch(IllegalArgumentException e) {
System.out.println(e.toString());
}
}
public static int divide(int i, int j) throws IllegalArgumentException{
if(j == 0){
throw new IllegalArgumentException("0으로 나눌 수 없습니다.")
}
int k = i / j;
return k;
}
}
두 가지 방법 중에 선택할 수 있다. 여기선 throws
를 사용했다.
내부적으로 처리 : try-catch
직접 처리하지 않고 호출시킨 곳에서 처리 : throws
divide메서드 실행 시, j가 0인 경우 IllegalArgumentException 오류가 발생한다. throws로 인해 해당 메서드를 호출한 main매서드의 try-catch문에서 오류를 처리한다.
사용자 정의 execption
execption은 java에서 이미 정해놓은 걸 사용할 수도 있고, 사용자가 직접 정의해서 사용할수도 있다.
excetion
이나 runtimexecption
을 상속받아서 사용자 execption을 만들 수 있다.
사용자 execption을 만드는 이유
특별한 기능이 있는 건 아니지만, 클래스 이름으로 사용자에게 직관적으로 어떠한 오류인지 알려주기 위함이다.
checked execption | 오류 처리를 하지않으면 컴파일 오류 발생 |
---|---|
runtime execption (unchecked execption) | 컴파일시 오류 발생안함 모든 예외상황에 대해서 적절히 처리해주는게 안정적인 코딩을 할 수 있다. |
사용자 execption 생성
public class BizException extends RuntimeException {
public BizException(String msg){
super(msg);
}
public BizException(Exception ex){
super(ex);
}
}
runtime execption
을 상속받는다.- msg를 받아서 super로 부모의 생성자에게 msg를 보낸다.
- ex를 받아서 super로 부모의 생성자에게 ex를 보낸다.
사용하는 방법은 java excption과 동일하다.
- https://programmers.co.kr/learn/courses/5/lessons/316
프로그래머스 내 자바 입문 강의를 보고 학습을 위해 작성된 글입니다.