인프런 커뮤니티 질문&답변

동민님의 프로필 이미지
동민

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

예외 구문에 대해서..

해결된 질문

작성

·

210

0

try throw catch 구문에서 throw로 예외를 던지면 catch 구문에서 받아서

예외에 대한 내용을 출력한다고 이해를 하고있는데

뒷쪽 강의를 듣다보니 스레드 join,sleep, 파일 읽기 구문을 try catch 구문으로 감쌀때 RuntimeExeption 과 InterruptedEception 그리고 IOException 친구들은 다른 throw catch 구문과 다른 것 같아서 질문 드립니다..

try { 
    thread.join(2500); // 2.5초 대기
} catch (InterruptedException e) {
    throw new RuntimeException(e);
}

---------------------------------------------------------------------------

try(BufferedReader br = new BufferedReader(new FileReader("goodjob.txt"))) {
            String line;
            while((line = br.readLine()) != null ) {
                System.out.println(line);
            }
        }catch (IOException e) {
            throw new RuntimeException();
        }

답변 1

0

나도코딩님의 프로필 이미지
나도코딩
지식공유자

안녕하세요?

어떤 교육청 관할에 10개의 고등학교가 있다고 가정하겠습니다. 그 중 하나의 고등학교를 예로 들어볼게요. 이 고등학교에는 3개 학년이 있으며, 각 학년마다 10개의 반이 있습니다. 그리고 각 반에는 30명의 학생이 있습니다. 이때 어떤 도시에서 특정 학생을 찾으려면 어떻게 해야 할까요?

10개의 고등학교 중 하나의 고등학교를 찾고, 하나의 고등학교 내에서 하나의 학년을 찾고, 하나의 학년 내에서 하나의 반을 찾고, 하나의 반 내에서 그 학생을 찾아야 할 겁니다. 우리는 학번을 이용하여 이를 쉽게 찾을 수 있습니다. 만약 30712 라고 한다면 3학년 07반 12번이라는 학생을 찾을 수 있는 것처럼요. 물론 앞에 고등학교를 식별하기 위한 어떤 값도 필요는 할겁니다.

만약 이 학생이 쉬는 시간에 화장실을 가고 싶으면 어떻게 될까요? 아마 스스로 화장실을 갈 겁니다. 자체 해결이 가능한 상황이죠.

만약 이 학생이 자습 시간에 떠들면 어떻게 될까요? 아마 선생님이 벌을 주시거나 칠판의 떠든사람으로 이름이 적힐 것입니다. (요즘 고등학교는 어떤지 몰라서 현실과 다를 수는 있습니다) 반 차원에서 해결이 가능한 상황이죠.

만약 이 학생이 엄청난 대회에서 수상을 한다면 어떻게 될까요? (설명을 위해 예외 상황 대신 좋은 상황으로 가정합니다) 아마 학년 전체, 또는 학교 전체의 자랑거리가 되어서 학교 차원에서 플래카드를 제작할 수도 있을 겁니다.

이렇게 각 상황에 따라 해결(또는 처리)해야 하는 범위가 달라질 수 있어요. 엄청난 대회에서 수상을 했는데 학교에서 가만 있다거나, 또는 개인이 화장실을 가고 싶은데 학교가 난리가 난다면 아마 뭔가 조금 이상할 겁니다.

예외 처리도 비슷합니다. 코드가 복잡해짐에 따라 예외가 발생했을 때 어느 곳에서 처리하느냐가 굉장히 중요해집니다. 작은 문제면 자체 해결을 할 수도 있지만 조금 큰 문제라거나 확인이 필요한 경우라면 자체 해결보다는 다른 쪽에서 해결을 하는 것이 필요할 때도 있습니다. 이 경우라면 작성해주신 코드처럼 catch 구문 내에서 다시 throw 를 하여 이 메소드를 호출한 쪽에서 예외를 처리하도록 미룰 수도 있게 되는거죠. 어디서 처리를 할 것인가에 대한 문제로 생각해주시면 되겠습니다.

가령 아래와 같은 코드가 있다고 하겠습니다. 선풍기와 에어컨을 각각 주문하는데, order1() 은 문제가 생겼을 때 자체적으로 해결을 하는 메소드이며 order2() 는 문제가 생겼을 때 호출한 쪽에서 해결을 하는 메소드입니다. order2() 의 경우 catch 내에서 다시 throw 를 하여 예외를 던지는데, 이 경우 main() 메소드에서 try catch 로 감싸서 order2() 를 호출해야 하며 main() 메소드의 catch 내에서 반드시 예외 처리를 해야 합니다.

public class Sample {
    public static void main(String[] args) {
        order1("선풍기");

        System.out.println();

        try {
            order2("에어컨");
        } catch (Exception e) {
            System.out.println("이 곳에서 문제 해결을 도와드리겠습니다.");
        }
    }

    public static void order1(String item) {
        System.out.println("-- order1 : 메소드 내에서 직접 처리 --");
        try {
            throw new Exception(item + " 재고 소진");
        } catch (Exception e) {
            System.out.println("오류 : " + e.getMessage());
            System.out.println("이용에 불편드려 죄송합니다.");
        }
    }

    public static void order2(String item) throws Exception {
        System.out.println("-- order2 : 메소드를 호출한 쪽에서 처리 --");
        try {
            throw new Exception(item + " 재고 소진");
        } catch (Exception e) {
            System.out.println("오류 : " + e.getMessage());
            throw e;
        }
    }
}

실행 결과는 다음과 같습니다.

-- order1 : 메소드 내에서 직접 처리 --
오류 : 선풍기 재고 소진
이용에 불편드려 죄송합니다.

-- order2 : 메소드를 호출한 쪽에서 처리 --
오류 : 에어컨 재고 소진
이 곳에서 문제 해결을 도와드리겠습니다.

정리하면 문제가 발생했을 때 어느 곳에서 처리할지에 따라 catch 문 내에서도 throw 를, 또는 아예 메소드 안에서 try catch 를 사용하지 않고 그냥 throw 를 사용할 수도 있습니다. 반드시 자체 try catch 문 내에서 모든 문제를 해결해야 하는 것은 아니랍니다. 궁금증 해결에 도움되길 바라겠습니다 😊

감사합니다.

동민님의 프로필 이미지
동민
질문자

항상 질문 답변 감사드립니다!

동민님의 프로필 이미지
동민

작성한 질문수

질문하기