Как я могу заставить эту надежность работать, используя пользовательский ввод?
Я пытался сделать надежный код на 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);