Как я могу заставить эту надежность работать, используя пользовательский ввод?

Я пытался сделать надежный код на Java, но это не похоже на работу. Что я ищу, так это чтобы пользователь ввел ввод, программа проверит ввод, если он не является обязательным, затем пользователю будет предоставлена ​​возможность повторно ввести соответствующий ввод до тех пор, пока ввод не будет соответствовать требуемым входам, или просто выйти. Вот что у меня так далеко. Когда я запускаю этот код, все работает хорошо, кроме случаев, когда пользователь вводит неправильный ввод и хочет выйти. Цикл while продолжает работать и не останавливается, даже когда пользователь повторно вводит правильный ввод или завершает работу. Как я могу сделать эту работу?

    //question
    System.out.println("Summer, Winter, Fall, or Spring");
    System.out.print("Which season is your favarite? ");
    String favSeason = in.next();
    System.out.println();

    //Control the inputs by converting them to Upper Case
    String favSeasonInput = favSeason.toUpperCase();

    //required answers of the question
    String seasons = "SUMMER, WINTER, FALL, SPRING?";
    String quit = "QUIT!";

    boolean isSeasons = (favSeasonInput.equals(seasons.substring(0, 6)) ||
            favSeasonInput.equals(seasons.substring(8, 14)) ||
            favSeasonInput.equals(seasons.substring(16, 20)) ||
            favSeasonInput.equals(seasons.substring(22, 28)));
    boolean isQuit = favSeasonInput.equals(quit.substring(0, 4));
    //inialize variables that will compute scores
    int favSeasonScore = 0;

    //if user enters an input otherthan seasons
    while (!isSeasons){

        favSeason = in.next();

        if(isQuit){
            System.exit(0); 
        }

    }


    //Conditions to set up scores for seasons
    if(favSeasonInput.equals(seasons.substring(0, 6))){
        favSeasonScore = 6;
        System.out.println("Summer is " + favSeasonScore + " points");
    }
    else if(favSeasonInput.equals(seasons.substring(8, 14))){
        favSeasonScore = 14;
        System.out.println("Winter is " + favSeasonScore + " points");
    }
    else if(favSeasonInput.equals(seasons.substring(16, 20))){
        favSeasonScore = 20;
        System.out.println("Fall is " + favSeasonScore + " points");
    }
    else if(favSeasonInput.equals(seasons.substring(22, 28))){
        favSeasonScore = 28;
        System.out.println("Spring is " + favSeasonScore + " points");
    }

    System.out.println(favSeasonScore);

1 ответ

Проблема в том, что вы не обновляете значения ваших логических переменных при чтении нового ввода; Вы даже не читаете это в одну и ту же переменную.

Так:

favSeason = in.next();

Должно быть:

favSeasonInput = in.next().toUpperCase();
isSeaons = ...;
isQuit = ...;

Но обратите внимание, что этот способ проверки правильности ввода ужасен. Он крайне неэффективен (вытягивает подстроки при каждой проверке), но также очень хрупок (вы должны правильно настроить эти индексы), и вам придется обновлять код в нескольких местах при изменении ваших требований.

Вы отображаете строку в целое число, поэтому используйте Map:

Map<String, Integer> seasonScores = new HashMap<>();
seasonScores.put("SPRING", 28);
// Etc.

Тогда ваш isSeason переменная становится:

isSeason = seasonScores.keySet().containsKey(favSeasonInput);

А твои условности уходят, становясь:

seasonScore = seasonScores.get(favSeasonInput);
Другие вопросы по тегам