while 내부에 try-catch를 넣은 상태에 대한 질문입니다.

조회수 7071회
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("10의 자리와 1의 자리가 같은지 판별합니다.");
    System.out.println("그만하려면 0을 입력하세요.");

    System.out.print("2자리수 정수 입력(10~99)>>");
    Integer num = null;

    while (true) {
        try{
            num = scanner.nextInt();
        }catch(Exception e){
            System.out.print("잘못된 입력입니다. 다시 입력하세요.>>");
        }finally {
            if (num == 0)
                break;
            else if ((num < 10) || (num > 99)) {
                System.out.print("2자리수 정수가 아닙니다. 다시 입력하세요.>>");

            }else {
                if (num % 10 == num / 10) {
                    System.out.println("Yes! 10의 자리와 1의 자리가 같습니다.");
                    System.out.print("2자리수 정수 입력(10~99)>>");

                }else{
                    System.out.println("No! 10의 자리와 1의 자리가 다릅니다.");
                    System.out.print("2자리수 정수 입력(10~99)>>");
                }
            }
        }

    }
    scanner.close();
}

위 코드에서 한번 exception이 발생했을 때 이후 try 블록을 실행하는 대신 catch 블록만 계속 실행합니다

비슷한 구조의 다른 코드를 실행했을 때는 정상적으로 실행이 되는데, 어느 부이 문제인걸까요?

Integer num = null;이나 num = scanner.nextInt();부분을 이리저리 바꿔봤는데

계속 같은 문제가 발생합니다.

아 그리고 이 문제에서 0 대신 enter만 누르는 걸로 프로그램을 종료시키려면 어떻게 해야 할까요?

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    저도 초보지만 답글 남겨봅니다.

    1. 처음부터 잘못된 입력을 받게되면 NullPointerException가 발생하여 프로그램이 죽어버리게 되고
    2. 처음에는 온전한 입력을 받은 후 잘못된 입력을 받게되면 자세히는 모르겠지만, scanner.nextInt()를 통해 입력을 받기 전에 그전 잘못된 입력으로 인하여 지속적으로 scanner에서 예외를 발생시키는 것 같습니다.
    catch(Exception e){
                    System.out.print("잘못된 입력입니다. 다시 입력하세요.>>");
                    scanner = new Scanner(System.in);
                }
    

    이 문제는 예외처리 부분에서 다시 scanner객체를 할당해주면 해결하실 수 있습니다.

    " 0 대신 enter만 누르는 걸로 프로그램을 종료시키려면 어떻게 해야 할까요?" -> 개인적인 생각으로는 scanner.nextInt() 대신에 String형 scanner.nextLine() 받아 해결했습니다. 그리고 난 후엔 num.hasCode()를 통하여 해결해 보시면 됩니다.

    그리고 개인적인 생각으론 finally부분이 있어야 되는지 의문입니다.

    여기서 반드시 수행해야 할 부분은 없는 것 같고 finally가 있음으로 예상치 못하게 프로그램이 죽을 수도 있다고 생각합니다. 또한, 첫질문을 해결하시면, 출력이 부자연스럽게 나오는 것을 보실 수 있을 겁니다. finally부분이 없다면 출력을 자연스럽게 할 수 있다고 생각합니다.

    ※ 잘못된 부분이 있다면 알려주세요!

    • finally 부분은 계속 안되길래 이렇게도 해보고 저렇게도 해보다보니 넣었지만 결국에는 뺐습니다. 그리고 catch 블록에서 scanner 객체를 다시 할당했더니 지역변수가 중복이라 오류가 뜨네요... HIAOAIH 2018.7.31 10:15
    • scanner 객체 다시 할당하는 대신 scanner.nextLine()으로 비웠더니 해결됐습니다. 답변해 주신게 힌트가 됐어요. 감사합니다! HIAOAIH 2018.7.31 10:26

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)