프로그래밍/JAVA

[JAVA] 예외 발생시키기(throw)

리신 2022. 11. 21. 05:30
반응형

자바에서 고의로 예외를 발생시킬 수 있다.

방법은 아래의 순서를 따르면 된다.

1. 면저, 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음
→    Exception e = new Exception("고의로 발생시킴");
2. 키워드 trow를 이용해서 예외를 발생시킨다.
     throwe;

두개를 합치면,
thrownew Exception("고의로 발생시킴");

 

💎예제💎

public class ExceptionEx9 {
    public static void main(String[] args) {
        try {
            Exception e = new Exception("고의로 발생 시킴");
            throw e;
        } catch (Exception e) {
            System.out.println("에러 메세지 : " + e.getMessage());
            e.printStackTrace();
        }
        System.err.println("프로그램이 정상 종료됨");
    }
}

 

아래 그림과 같이 에러가 발생함.

Exception인스턴스를 생성할 때, 생성자에 String을 넣어 주면, 이 String이 Exception인스턴스에 메시지로 저장된다.

이 메세지는 getMessage()를 이용해서 얻을 수 있다.

 

🙄❔ 그런데 강제로 예외를 발생시키는 이유는 뭘까?

필자가 생각하기에는 코드상 예외가 발생하지 않지만 시스템상 예외가 발생했을 때 따로 처리해야 할 로직이 있을 경우 쓰인다고 생각한다.

💎예제💎

예를 들어 회원ID 중복확인 메서드를 구현할 때, 사용자의 ID가 이미 존재할 경우 처리해야 할 예외 로직을 만들어두고 thorw를 사용하여 던질 수 있다.

public class UserDao {
    public boolean isExistUserID(String userId) throws UserExistException{
        User user = userDao.findUserById(userId);
        
        if(user != null){
            throw new UserExistException();
        }
    } 
}

 

🙄❔ 그럼 예외 처리를 해야 하는 것이 있고, 하지 않아도 되는 것이 있는데 왜 그런 걸까?

아래 왼쪽 그림처럼  Exception클래스들(Exception 클래스와 그 자식클래스들)이 발생할 가능성이 있는 문장들에 대해 예외처리를 해주지 않으면 컴파일 조차 되지 않는다.
반면 오른쪽의 그림의 RuntimeException은 예외처리를 하지 않았음에도 불구하고 성공적으로 컴파일 된다. 

 

왜 RuntimeException은 예외 처리를 하지 않아도 되는 걸까?

RuntimeException클래스와 그 자식클래스에 해당하는 예외는 프로그래머에 의해 실수로 발생하는 것들이기 때문에 예외처리를  강제하지 않는 것이다.

만약 RuntimeException클래스들에 속하는 예외가 발생할 가능성이 있는 코드에 예외처리를 필수로 해야한다면,

참조 변수와 배열이 사용되는 모든 곳에 예외처리를 해주어야 할 것이다.

 

✅참고

컴파일러가 예외처리를 확인하지 않는 RuntimeException클래스들은 'unchecked예외' 라고 부르고,
예외처리를 확인하는 Exception클래스들은 'checked예외' 라고 부른다.

 

 

*참고서적 

Java의 정석

 

반응형