JAVA/JAVA 정리

오류를 미리 예측해서 대응할수 있는 멋쟁이 Exception을 알아보자

Exception을 통해 예외상황을 미리 예측하고 처리할 수 있다.

훗 예상했지.. 너란 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);
        }
    }
  1. runtime execption을 상속받는다.
  2. msg를 받아서 super로 부모의 생성자에게 msg를 보낸다.
  3. ex를 받아서 super로 부모의 생성자에게 ex를 보낸다.

super 공부하기

사용하는 방법은 java excption과 동일하다.

- https://programmers.co.kr/learn/courses/5/lessons/316

프로그래머스 내 자바 입문 강의를 보고 학습을 위해 작성된 글입니다.

728x90
반응형