내배캠

개인과제 트러블슈팅 - 숫자 야구 게임

muerha 2024. 10. 25. 13:57

 


 

 

 

Java를 활용한 숫자 야구 게임을 만들던 도중

 

정답을 맞추고 나면 종료와 재시작을 선택할 수 있도록 하는 로직을 작성

 

하지만 정답을 맞춘 후 사용자의 입력을 받지 않고 Exception in thread "main" java.util.NoSuchElementException 오류가 발생하는 것을 알게되었고 해당 오류가 발생하는 원인을 찾아보던 중 

 

public void play() {
        Scanner sc = new Scanner(System.in);
        System.out.println();
        System.out.println("< 게임을 시작합니다. >");

        while (true) {
            List<String> inputNumberList;
            Set<String> inputNumberSet = new LinkedHashSet<>();

            while (true) {
                System.out.println();
                System.out.println("숫자를 입력하세요.");
                inputNumberSet.clear();
                String inputNumbers = sc.next();

                if(inputNumbers.length() != 3){
                    System.out.println("세자리 수만 입력 가능합니다.");
                    continue;
            	}
                
                생략
                
            }
        }
		sc.close();
    }
}

 

play()메서드에서 Scanner를 닫아 이후에 main 메서드에서 이미 닫힌 스트림을 참조하게 되어 NoSuchElementException이 발생한다는 것을 알게되었다.

 

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        /**
         * 사용자가 선택할 수 있는 옵션을 출력합니다.
         * 사용자가 게임 실행과 종료를 선택할 수 있도록 합니다.
         */
        while(true) {
            System.out.println("환영합니다! 원하시는 번호를 입력해주세요");
            System.out.println("1. 게임 시작하기 2. 게임 기록 보기 3. 종료하기");
            int choice = sc.nextInt();
            if (choice == 1) {
                while (true){
                    GameLogic gamelogic = new GameLogic();
                    gamelogic.play();
                    System.out.println("종료하고싶으면 'no'를, 계속 진행하시려면 아무 키나 입력해주세요.");
                    String replay = sc.next();

                    if("no".equals(replay)){
                        break;
                    }
                }
                break;
            }else if (choice == 2) {
                System.out.println("해당 기능을 준비중입니다.");
            }else if (choice == 3) {
                System.out.println("게임을 종료합니다.");
                break;
            }else {
                System.out.println("1, 2, 3 중에 선택하세요.");
            }
        }
        sc.close();
    }
}

 

Scanner를 main 메서드 끝에서만 닫아 입력을 받을 수 있도록 수정하였다.