如何使用用户输入使健壮性发挥作用?

问题描述:

我试图在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); 
+2

不包含代码作为图像粘贴在这里 – Lokesh

+0

请在此处粘贴您的代码并解释n您正在收到什么错误 –

+1

您现有的代码有什么问题? –

问题是,当您读取新输入时,您不更新布尔变量的值;你甚至不会将它读入同一个变量。

所以:

favSeason = in.next(); 

应该是:

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

但是请注意,检查有效的输入的方式是可怕。这是非常低效的(抽出每个支票上的子字符串),但也非常脆弱(必须使这些索引正确),并且需要更改时必须在多个位置更新代码。

你映射一个字符串转换为整数,所以使用地图:

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

那么你isSeason变量变为:

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

而且你的条件语句消失,成为:

seasonScore = seasonScores.get(favSeasonInput);