【问题标题】:How to return a value from a do while loop如何从do while循环中返回一个值
【发布时间】:2016-01-30 15:03:25
【问题描述】:

我正在尝试创建一个石头、纸、剪刀游戏,该游戏需要用户的有效输入才能继续。我试图解决这个问题的方法是在内部创建一个 do while 循环和一个 if else 语句来验证输入。如果它不是给定的选择,则条件保持为假并且程序循环。但是,我试图弄清楚如何返回存储在 UserChoice 中的用户输入的正确值,以便我可以访问循环外的变量并继续执行程序。

这是我的代码:

do{
    System.out.println("Enter in rock, paper or scissors:");
    Scanner user = new Scanner(System.in);
    String UserChoice = user.nextLine(); 

    if(!UserChoice.equals("rock") && (!UserChoice.equals("paper")) && (!UserChoice.equals("scissors"))){
        System.out.println("You must enter either rock, paper or scissors. Try again: ");
    }else{
        isRight = true;
    }
}while(isRight==false);

【问题讨论】:

  • 在循环外声明一个变量,并将其存储在该变量中
  • 首选while(!isRight)

标签: java loops return conditional


【解决方案1】:

只需将变量声明移出循环,使其在 do-while 块的范围之外可用,就像:

String userChoice = null;
do{
    System.out.println("Enter in rock, paper or scissors:");
    Scanner user = new Scanner(System.in);
    userChoice = user.nextLine(); 

    if(!"rock".equals(userChoice) && (!"paper".equals(userChoice)) && (!"scissors".equals(userChoice))){
         System.out.println("You must enter either rock, paper or scissors. Try again: ");
    }else{
         isRight = true;
    }

}while(isRight==false);

//here you can still use it
System.out.println(userChoice);

您可以阅读有关变量范围的信息,例如 here

只是一些评论。最好在调用equals 时使用"rock".equals(userChoice) 表示法,以防止在您的userChoice 对象出于任何原因为NULL 时出现NullPointerException。此外,您可以将这一行 Scanner user = new Scanner(System.in); 移出循环。没有理由在每次迭代时创建扫描仪的新实例。最后一个,虽然条件 isRight==false 可以替换为 !isRight,但无需将其与某物进行比较,因为变量本身就是布尔值。

【讨论】:

    【解决方案2】:

    在循环之外声明变量(正如我之前在 cmets 中所建议的那样)旁边,关于您的代码的几点说明:

                    System.out.println("Enter in rock, paper or scissors:");
                    Scanner user = new Scanner(System.in);
                    String userChoice = user.nextLine(); //stick to naming conventions, it makes your code easier to read
    
    
    
                    while(!userChoice.equals("rock") && (!userChoice.equals("paper")) && (!userChoice.equals("scissors"))){
                        System.out.println("You must enter either rock, paper or scissors. Try again: ");
                System.out.println("Enter in rock, paper or scissors:");
                     userChoice = user.nextLine(); //stick to naming 
                }
    

    根本不需要每次都循环整个代码块。需要重复的只是错误消息和读取 userChoice 的新值,并且仅在原始条目无效的情况下。

    例如,在您的代码中,您每次循环时都会创建一个新的 Scanner 实例,而您可以只重用现有的实例。

    【讨论】:

      【解决方案3】:

      在 do while 之前初始化 UserChoice

      String UserChoice = "";
      
      do 
      ....
      
      while ();
      
      System.out.println(UserChoice);
      

      【讨论】: