Resolved
Written on
·
64
·
Edited
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
멀티스레드와 동시성 강의-스레드 생명주기 파트에서 질문 드립니다.
Thread.sleep(3000)으로 InterruptedException이 발생했고, catch로 그걸 잡았는데 왜 sleep()으로 다시 돌아가서 다음 로그가 출력되는 등 정상 흐름이 마저 진행되나요? 체크 예외가 발생하면 그걸 catch로 잡더라도 이후 코드는 마저 실행되지 않아 finally 코드가 도입된 것이 아니었나요? java-mid1에서 체크 예외가 발생해 나머지 코드가 실행되지 않아 자원 정리가 안 되었던 예제를 배웠던 것 같은데, 이 예제와 무슨 차이가 있어서 다른 결과가 나오는지 궁금합니다ㅠㅠ
2. 이 예제에서 InterruptedException이 발생해서 그걸 catch한 것까지는 이해됩니다. 그런데 왜 굳이 새 RuntimeException을 생성해서 또 던지는 건가요? InterruptedException 이외에 추가로 발생할 지도 모르는 다른 예외들도 한꺼번에 잡아서 던지려는 의도인가요(예방 차원)?
3. 예외를 어떤 경우에 잡고 어떤 경우에 던져야 하는지 궁금합니다. java-mid1 예외 처리 파트에서 예외를 못 잡으면 던지고 잡을 수 있으면 잡아야 한다고 배웠는데, 그 구체적인 기준을 잘 모르겠습니다. 그걸 배울 당시에는 '아직 기초 단계라 기본 개념만 잡고 자세한 오류 해결 과정은 나중에 나오나 보다'하고 넘겼는데, 이 예제에서도 그냥 catch(발생한 오류) 정도로 넘어가는 걸 보니 제가 뭔가 놓치고 있는 것 같습니다. 그냥 catch()코드를 넣으면 오류를 잡았다고 자바 상에서 처리가 되는 건가요? 그런 거면 그냥 오류를 다 catch로 잡아버리면 될 것 같은데, 굳어 던져야 하는 상황은 어떤 상황인가요...?
질문이 너무 길어졌네요. 친절한 답변에 미리 감사드립니다!!!
Answer 3
0
안녕하세요, 김영한 강사님. 강의 잘 듣고 있습니다. 친절하게 답변 남겨주셔서 감사합니다!
조언 주신 대로 예외 처리 단원을 전체 복습하고 왔습니다. 그런데도 여전히 뭔가 이해가 완벽히 안 돼서 뭐가 문제일까 고민해 보니, 제가 InterruptedException을 잘못 이해하고 있다는 걸 깨달았습니다. sleep()가 스레드 진행을 잠시 지연시키는 메서드이다 보니, InterruptedException 체크 예외를 잡는 코드가 의무화되어 있다는 부분에서 무심결에 'sleep() 메서드는 interruptedException을 발생시키기 때문에 체크 예외 처리를 반드시 해야 한다'라고 이해한 것 같습니다.
어쩐지 이후 인터럽트 파트를 배울 때도 뭔가 이상하고 이해가 안 됐는데, 전부 이 오개념 탓이었던 것 같습니다. 문제점을 찾으니 속이 후련하네요. 도와주셔서 감사합니다.
0
안녕하세요. 자바재밌당님
우선 Thread.sleep(3000)을 호출했지만 해당 시점에 예외가 발생한 것이 아닙니다.
따라서 3초간 대기한 이후에 다음 로직이 정상 수행됩니다.
Thread.sleep(3000)은 체크 예외를 던집니다. 체크 예외의 경우 반드시 잡아야 하도록 코드를 강제하기 때문에 catch로 해당 예외를 잡도록 코드를 작성한 것입니다.
만약 Thread.sleep(3000)을 호출하는 동안 예외가 발생했다면 해당 예외를 잡겠지만 그게 아니라면 다음 로직이 정상 수행됩니다. 여기서는 정상 수행되었습니다.
예외 처리에 대한 부분을 다시 한번 정리하고 복습하는 것이 필요해보입니다. 자바 중급 1편 -> 9. 예외 처리1, 10. 예외 처리2 부분을 꼭 다시 공부하고 넘어와주세요.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. 자바재밌당님.
자바 멀티스레드와 동시성 강의에서 InterruptedException
의 처리 방식과 일반적으로 예외를 처리하는 방법에 대해 잘 이해가 가지 않는 부분이 있으신 것 같습니다. 이에 대해 자세한 설명과 관련된 링크를 공유하겠습니다.
InterruptedException
발생 후 정상 흐름이 진행되는 이유:Thread.sleep(3000)
실행 중 InterruptedException
이 발생하면 현재 쓰레드는 중단되고 catch
블록으로 넘어가게 됩니다. catch
블록에서는 예외를 처리하고 있기 때문에, 예외가 발생했지만 정상 흐름으로 돌아갈 수 있게 됩니다. 자바 예외 처리에서 try-catch
를 사용하면 예외가 발생해도 프로그램이 비정상적으로 종료되지 않고, 정상 흐름으로 이어갈 수 있는 일종의 안전망을 제공하는 역할을 합니다.
유사한 질문을 참고해보세요: 자바 예외 처리3 - 체크 예외 질문 여기에서는 예외를 잡는 것과 던지는 것에 대한 현실적인 예제를 설명하고 있습니다.
RuntimeException
을 던지는 이유:InterruptedException
을 catch
한 후 RuntimeException
으로 다시 던지는 이유는 주로 호출자에게 이 예외를 인지시켜야 할 필요가 있을 때 사용합니다. 일반적인 관행으로는 호출 메서드에서 예외 처리를 강제하지 않고, 해당 예외 상황이 발생했음을 알리기 위해 RuntimeException
으로 감싸 던지기도 합니다. 이는 특정 컨텍스트에서 더욱 명확한 예외 인지를 보장하려는 의도일 수 있습니다.
예외를 잡고 던지는 기준:
잡아야 하는 경우: 예외를 잡아 내부적으로 처리해야 할 때, 즉 시스템 내부에서 예외 상황 별로 대처가 가능한 경우 예외를 잡습니다. 예를 들어, 파일을 열다가 실패한 경우 재시도하거나, 기본 값을 사용하는 방법 등이 있습니다.
던져야 하는 경우: 메서드 내에서 예외를 처리할 방법이 없고, 외부에서 처리하도록 하고자 할 때 예외를 던집니다. 이러한 경우, API 설계 시 주로 호출자가 예외를 처리하도록 설계합니다.
위의 설명이 도움이 되셨기를 바랍니다. 더 자세히 알고 싶으신 경우, 관련 자료와 강의를 통해 더 많은 정보를 확인하세요. 특히, 관련된 다른 질문 링크도 참고하면 이해하는 데 도움이 될 것입니다.
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.