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

냐암2님의 프로필 이미지
냐암2

작성한 질문수

김영한의 실전 자바 - 중급 1편

Class 클래스

예외 처리에 관하여

작성

·

60

0


[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
여기에 질문 내용을 남겨주세요.

 

자바 중급1을 모두 학습하고 다시 보면서 복습을 하고 있던 도중 이해가 가지 않는 부분이 있어 질문 드립니다.

 

섹션5 Class클래스강의 (13:26)에 나오는 ClassCreateMain 클래스에 대해 질문 드리려고 합니다.

 

main부분에서 throws Exception을 해야 오류가 않나는 것을 확인했습니다. 예외파트 강의에서 main에서도 예외를 던져버리면 에러가 난다고 이해했었는데 main에서도 예외를 던졌는데 이 예외는 어떻게 리되는 건가요?

답변 2

0

안녕하세요. 안정현님, 공식 서포터즈 y2gcoder입니다.

아마도 ClassCreateMainmain 메서드에서 throws Exception을 해주지 않으면 컴파일 에러가 발생할 것입니다 🙂

package lang.clazz;

public class ClassCreateMain {

    public static void main(String[] args) {
        //Class helloClass = Hello.class;
        Class<?> helloClass = Class.forName("lang.clazz.Hello"); //ClassNotFoundException
        Hello hello = (Hello) helloClass.getDeclaredConstructor().newInstance(); //NoSuchMethodException
        String result = hello.hello();
        System.out.println("result = " + result);
    }
}

컴파일 에러가 나는 부분에 커서를 올려보시면 아마도 Class.forName()helloClass.getDeclaredConstructor() 에서 각각 ClassNotFoundExceptionNoSuchMethodException 에 대한 처리를 요구하는 것을 발견하실 수 있습니다.

이 둘은 모두 CheckedException 으로 본 강의의 예외 처리 챕터에서 학습하셨던 것과 같이 throws 를 통해 밖으로 던져주거나, try-catch 문 을 이용해 해당 로직 내에서 처리해주어야 합니다. 해당 시점에서는 학습에 집중하기 위해 예외를 각각 잡아서 처리해주지 않고 throws Exception 을 통해 모든 예외를 던져주는 방향으로 구현했습니다!

만약 main 메서드에서 이렇게 throws Exception을 던지게 구현했는데, main 메서드에서 예외가 발생했을 때 처리가 궁금하시다면 아래의 AI 인턴의 답변을 참고해주십쇼!

 

감사합니다.

냐암2님의 프로필 이미지
냐암2
질문자

main에서 조차도 예외를 던져버리게 되면 AI답변에 의하면 JVM에서 스택 트레이스를 출력해주고 처리해준다고 되어있는데, 막상 던졌는데 정상 작동이 되는게 잘 이해가 되지 않습니다.

 

답변 감사합니다!

메서드 시그니처 옆 throws Exception 이라는 것은 Exception (및 상속하는 모든 예외)가 메서드 내에서 발생했을 때 이를 밖으로 던져주라는 의미입니다.

실제로 예외가 발생했을 때는 AI 답변 처럼 작동하지만, 예외가 발생하지 않은 정상 동작이라면 정상 작동하는 것이 맞습니다 🙂

예외 처리 부분을 다시 복습해보시면 이해가 가실 거라 생각합니다!

냐암2님의 프로필 이미지
냐암2
질문자

Class.forName()helloClass.getDeclaredConstructor() 에서 각각 ClassNotFoundExceptionNoSuchMethodException 이 났다는 이유는 예외가 발생했기 때문이고 이 예외를 처리해주기 위해서 throws Exception을 해준 것이므로 예외가 발생한 비정상 작동이라고 봐야하는 거라고 생각되어 잘 이해가 가지 않습니다

 

답변 감사합니다!

 

Class.forName()helloClass.getDeclaredConstructor() 에서 각각 ClassNotFoundExceptionNoSuchMethodException 이 났다는 이유는 예외가 발생했기 때문이고

=> 컴파일 오류가 발생한 것은 실제로 예외가 발생했기 때문에 컴파일 오류가 발생한 것이 아닙니다. 체크 예외를 던지는 메서드들이기 때문에 throws 로 던지든, try-catch 문을 사용하든 자바 문법 상 체크예외 발생했을 때의 처리를 꼭 해줘야 하기 때문에 컴파일 에러가 발생하는 것입니다 🙂

체크 예외가 실제로 발생할 지는 지금 알 수 없습니다 🙂 항상 예외가 발생하는 메서드라면 잘못된 메서드입니다!

냐암2님의 프로필 이미지
냐암2
질문자

체크 예외로 던져도 예외가 발생하지 않을 수도 있군요...

 

덕분에 잘못된 개념 바로 잡은 것 같습니다 감사합니다!

0

안녕하세요, 인프런 AI 인턴입니다. 안정현님.

자바의 예외 처리와 관련된 부분에 대해 질문해주셨군요. 예외 처리에서 main 메서드에서 예외를 던지는 상황에 대한 이해를 돕기 위해 참고할 수 있는 유사한 질문과 답변을 제공해드립니다.

먼저, 연관된 질문들을 참고하시기 바랍니다:

  1. Throws Exception 사용 지양? - 이 질문에서는 throws Exception의 기본 개념과 예외 처리 방식에 대해 다룹니다.
  2. 자바 예외 처리3 - 체크 예외 질문 - 이 질문에서는 예외를 던지는 것과 잡는 것에 대한 현실적인 사례와 좋은 설명이 포함되어 있습니다.

기본적으로 main 메서드에서 throws Exception을 사용하게 되면, 해당 예외는 JVM에 의해 처리됩니다. 이때 JVM은 예외 스택 트레이스를 출력하고 프로그램을 종료하는데 이러한 동작 때문에 예외 처리를 하지 않았을 때와 유사하게 프로그램이 종료됩니다. 그러나, throws Exception을 사용하게 되면 코드 내에서 의도적으로 예외를 던진다는 명확한 표시를 남길 수 있습니다.

참조하신 강의와 관련된 질문도 있어 이를 함께 공유합니다:

  1. 예외 관련 질문있습니다. - 언제 throws를 사용하고 언제 직접 catch해서 처리해야 하는지에 대한 내용입니다.
  2. 예외처리 관련 질문 - 예외를 던졌을 때, 예외가 어디서 어떻게 처리되는지에 대한 문의입니다.

위의 링크들을 참고하시고 추가로 궁금한 점이 있으시면 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

냐암2님의 프로필 이미지
냐암2

작성한 질문수

질문하기