当按两次输入时,扫描仪循环不会循环

时间:2015-09-25 16:46:37

标签: java while-loop java.util.scanner

boolean loop = false;
double numberOfStudents;


System.out.print("Enter a number: ");

if ((scnr.nextLine().trim().isEmpty()) ) {
    loop = true;
}

while (loop) {
    System.out.println("Enter a number");

    if (scnr.hasNextDouble() ){
        System.out.println("Loop has stopped");
        numberOfStudents = scnr.nextDouble();
        loop = false;
    }

}           

System.out.println("You're outside the loop!");

我试图让节目说出" 输入一个数字"直到用户输入实际数字(没有空格或字母或符号)。当用户输入一个数字时,它会将numberOfStudents设置为等于该数字,并突破循环。

但如果你按两次输入,它就不会迭代。它只显示" 输入数字"一旦。

循环逻辑有什么问题?为什么在进行有效输入之前它不会循环?

9 个答案:

答案 0 :(得分:3)

对于“为什么不输入数字”问题的实际答案不止一次?见Tom's comment(更新:汤姆的回答)。

我已经以保留代码的方式重写了你的循环,但也使得处理格式异常变得容易一些(虽然冒着悄悄地吞下异常的风险 - 这个用例应该是可以接受的)。 / p>

可以由你来使用这个设计,here is an SO post为什么空的catch块可能是一个不好的做法。

public static void main(String args[])
{
    boolean loop = true;
    double numberOfStudents;
    Scanner scnr = new Scanner(System.in);

    while(loop){
        System.out.print("Enter a number: ");

        String input = scnr.nextLine();
        try{
            numberOfStudents = Double.parseDouble(input);
            loop = false;
        }catch(NumberFormatException e){
        }
    }
    System.out.println("You're outside the loop!");
}

输出:

  

输入数字:
  输入一个数字:
  输入一个数字:
  输入一个数字:50
  你在循环之外!

答案 1 :(得分:3)

虽然trobbins代码基本上解决了您的问题,但使用异常进行流量控制是不好的做法。

我使用了一个小的正则表达式来检查该值是否为数字。但是这个例子并不完整,用户输入例如两个小数点时仍然会崩溃。因此,您需要创建一个正确的数字检查,或者只使用检查更容易的整数。

评论中的某些人指出,人们可能想要输入像5e10这样的科学记数法,所以这也是另一种需要检查的案例。如果这只是您需要的一些代码作为概念证明或快速和脏的东西,您可以使用异常处理方法,但在生产代码中,您应该避免以这种方式使用异常。

double numberOfStudents;
Scanner scnr = new Scanner(System.in);

while(true) {
    System.out.print("Enter a number: ");
    String input = scnr.nextLine().trim();

    if(input.matches("^[0-9\\.]{1,}$")) {
        System.out.println("Loop has stopped");
        numberOfStudents = Double.parseDouble(input);
        break;
    }
}

System.out.println("You're outside the loop!");

答案 2 :(得分:3)

首先:由于您正在从System.in读取,因此对输入流的调用将会阻止,直到用户输入有效的令牌。

因此,让我们使用您的scnr变量检查第一次扫描:

scnr.nextLine()

nextLine()读取所有内容直到下一行分隔符。因此,如果您只需按 return ,它就会成功读取它并执行下一步。

下一个电话是:

scnr.hasNextDouble()

此调用需要“真实”令牌并忽略空格,除非作为标记之间的分隔符。因此,如果您再次按 return ,它实际上并不会读取该输入。所以它仍然等待更多(对于第一个令牌)。这就是为什么它会停留在你的循环中而你不会得到另一个“输入数字”输出。

您可以通过输入真实令牌(如数字)或更改trobbins之类的循环来解决此问题。

我希望你现在能更多地理解你的程序流程:)。

答案 3 :(得分:2)

以下代码可以帮助您:

    double numberOfStudents = 0;
    Scanner scnr = new Scanner(System.in);

    boolean readValue = false;            //Check if the valid input is received
    boolean shouldAskForNumber = true;    //Need to ask for number again? Case for Enter
    do {
        if (shouldAskForNumber) {
            System.out.print("Enter a number:");
            shouldAskForNumber = false;
        }

        if (scnr.hasNextDouble()) {
            numberOfStudents = scnr.nextDouble();
            readValue = true;
        } else {
            String token = scnr.next();
            if (!"".equals(token.trim())) {   //Check for Enter or space
                shouldAskForNumber = true;
            }
        }
    } while (!readValue);

    System.out.printf("Value read is %.0f\n", numberOfStudents);
    System.out.println("You're outside the loop!");

更新

以不同的方式理解以下陈述:

  

但如果你按两次输入,它就不会循环回来。它只显示   "输入一个数字"一次。

代码设置为打印"如果用户点击 RETURN / ENTER ,则仅输入一个数字" 进入空间角色。您可以删除特殊检查并在需要时使用代码。

答案 4 :(得分:1)

import java.util.Scanner;

public class Testing {
    public static boolean checkInt(String s)
    {
        try
        {
            Integer.parseInt(s);
            return true;
        } catch (NumberFormatException ex)
        {
            return false;
        }
    }
    public static void main(String[] args) {
        boolean loop = false;
        double numberOfStudents;
        Scanner scnr = new Scanner(System.in);

            String input = "";

            while (!(checkInt(input))) {
                System.out.println("Enter a number");
                input = scnr.nextLine();
            }
            numberOfStudents = Integer.parseInt(input);

        System.out.println("Number of students: " + numberOfStudents );
    }
}

//如果您想要查看,此代码工作正常。 //在你的代码中,如果第一个是int / double,你需要另一个输入;如果第一个输入不是数字,那么你提到再次输入..

答案 5 :(得分:0)

使用调试器查看代码实际执行的操作。 Here's a guide on debugging in Eclipse。完成代码调试后,您可能会知道问题所在。

答案 6 :(得分:0)

以下代码正常运作,

boolean loop = true;
    double numberOfStudents;
        Scanner scnr=new Scanner(System.in);
       while(loop) {
            System.out.println("Enter a number");
               if ((scnr.nextLine().trim().isEmpty()) ) {
            loop = true;
        }
            if (scnr.hasNextDouble() ){
                System.out.println("Loop has stopped");
                numberOfStudents = scnr.nextDouble();
                loop = false;
            }
        }
    System.out.println("You're outside the loop!");

输出是,

run:
Enter a number
hj
po
Enter a number
lhf
Enter a number
o
Enter a number
p
Enter a number
a
Enter a number
34
Loop has stopped
You're outside the loop!

答案 7 :(得分:0)

以下代码可以帮助您

    boolean loop = true;
    double numberOfStudents;
    Scanner scnr = new Scanner(System.in);
    System.out.print("Enter a number: ");
    String input = scnr.nextLine();
    while(!scnr.hasNextDouble()){
        System.out.print("Enter a number: ");
        try{
            numberOfStudents = Double.parseDouble(input);
            break;
        }catch(NumberFormatException e){
        }
        input = scnr.nextLine();
    }
    System.out.println("You're outside the loop!");

答案 8 :(得分:-1)

如果您想再次从扫描仪获取更多值,则必须扫描下一行。代码应该是:

while (loop) {
        System.out.println("Enter a number");
        if(!(scnr.nextLine().trim().isEmpty())){
            if (scnr.hasNextDouble() ){
                System.out.println("Loop has stopped");
                numberOfStudents = scnr.nextDouble();
                loop = false;
            }
        }
    }