프로그래밍 언어/Java

[Java] 예외 발생 try catch 와 throw 그리고 throws의 비교 정리

happy_life 2022. 5. 16. 21:45

목차

1. try-catch 

2. throw

3. throws

 

1. Try-catch

개념: 예외처리 구문

예시 코드를 통한 try-catch 구조의 이해

public class ThrowExample {

    public static void main(String[] args) {
        try {
            // 예외 발생 가능성이 있는 코드
            int i = 100;
            int a = 0;
            System.out.println(i/a);

        } catch (Exception e) {

            // 예외가 발생했을 경우만 실행
            System.out.println("예외 종류: " + e);
            System.out.println("예외가 발생하였습니다.");

        }
        finally {
        	// 예외가 있든 없든 무조건 실행됨
            System.out.println("-----------------------------");
            System.out.println("예외가 있든 없든 무조건 실행 됩니다.");
        }
    }
}

 

출력결과

 

 

2. Throw

개념: 예외를 던져주는 코드

 

예외를 직접 생성해 일부러 던져준다는 Throw의 개념은 쉽게 이해가 됩니다. 하지만 도대체 왜 Throw의 기능이 필요할까요?

예를 들어 내가 나눗셈을 만들었는데 1로 나누면 안되게 조건을 걸어주고 싶다면 아래와 같이 코드를 작성해야 합니다.

 

1. OneShouldNotInHereException 이라는 클래스를 만든다.

2. 특정 조건에서 예외를 던지게구성한다.

 

예제 코드

public class ThrowExample {

    public void divideNum(int i, int a) {
        if (a == 1) {
            try {
                throw new OneShouldNotInHereException();
            } catch (OneShouldNotInHereException e) {
                System.out.println("에러: 1로 나눌 수 없습니다.");
            }

        } else {
            System.out.println(i / a);
        }
    }

    public static void main(String[] args) {

        ThrowExample throwExample = new ThrowExample();
        System.out.println("*첫 번째 계산");
        // 예외 발생 가능성이 있는 코드
        int i = 100;
        int a = 1;

            throwExample.divideNum(i, a);
    }
}

출력결과

 

OneShouldNotInHererException

이는 아래와 같이 exception을 상속받아 만들어 주었습니다.

 

3. Throws

그렇다면 도대체 Throws 와의 차이는 무엇인가요? throws 는 throw 값을 받는 곳에서 예외를 처리하도록 하여 예외처리의 주체를 바꿔주는 겁니다. 아래의 코드와 위의 코드를 비교해봅시다.

 

예제 코드

public class ThrowExample {

    public void divideNum(int i, int a) throws OneShouldNotInHereException {
        if (a == 1) {

            throw new OneShouldNotInHereException();

        } else {
            System.out.println(i / a);
        }
    }

    public static void main(String[] args) {

        ThrowExample throwExample = new ThrowExample();
        System.out.println("*첫 번째 계산");
        // 예외 발생 가능성이 있는 코드
        int i = 100;
        int a = 1;
        try {

            throwExample.divideNum(i, a);

        }
        catch (OneShouldNotInHereException e) {
            System.out.println("에러: 1로 나눌 수 없습니다.");
        }
    }
}

기존에는 메소드 안에서 예외를 처리했지만, 메소드 밖의 main()에서 예외처리를 하게 됩니다.

 

요약:

throw를 사용하여 프로그래머가 원하는 조건에 원하는 예외를 생성할 수 있습니다.

이를 메소드 안에서 처리할 수도 있지만, throws를 통해 메소드를 호출하는 곳에서 예외를 처리할 수 있게 하는 것입니다.