【问题标题】:Scanner not waiting for NewLine to collect input with a loop扫描仪不等待 NewLine 通过循环收集输入
【发布时间】:2017-07-07 01:44:14
【问题描述】:

我对编码很陌生,希望你们能帮助我。 我遇到了 nextDouble 不等待 print.ln 收集数据的问题。 使用我的启动输入,我必须输入两个数字才能移动到下一行并要求我已经输入的第二个数字,因为它没有等待。 到那时,它还决定请求第三个数字并接受该数字的输入,但可以毫无问题地请求第三个和第四个数字。 当它重复时,它也会发生在循环内部。

我知道使用 nextDouble 并不意味着它会“等待”换行符,我知道 nextNumbertype 没有换行符标志,但通常的技巧 在获得双精度后添加“input.nextLine”似乎不起作用。

我知道我可以将所有输入作为字符串稍后再转换,但这是一项家庭作业,我的教授似乎想要一种非常具体的方式。

关于什么是错的或我可以尝试什么的任何想法?

这是输出:

Enter x1 or <crtl + z> to quit
1
4
Please input the x2 number:
Please input the y1 number:
1
Please input the y2 number:
5
Distance is 5.000000 

Enter x1 or <crtl + z> to quit

下面是实际代码:

import java.util.Scanner;

public class distanceFinder {

public static void main(String[] args)
{
    Scanner input = new Scanner(System.in);
    double x1 = 0;

    System.out.println("Enter x1 or <crtl + z> to quit");
    x1 = input.nextDouble();


    while(input.hasNext())
    {

    System.out.println("Please input the x2 number:");
    double x2 = input.nextDouble();

    System.out.println("Please input the y1 number:");
    double y1 = input.nextDouble();

    System.out.println("Please input the y2 number:");
    double y2 = input.nextDouble();

    double x3 = 0;
    double y3 = 0; 
    double xy1 = 0;

    x3 = Math.pow((x2 - x1), 2);
    y3 = Math.pow((y2 - y1), 2);

    xy1 = x3 + y3;

    double distance = Math.sqrt(xy1);

    System.out.printf("Distance is %.6f %n%n%n",  distance);

    System.out.println("Enter x1 or <crtl + z> to quit");
    x1 = input.nextDouble();

    }
input.close();
}

}

【问题讨论】:

  • 问题在于 hasNext 根据 javadcos 此方法可能会在等待输入扫描时阻塞。

标签: java loops input


【解决方案1】:

问题是Scanner.hasNext() 阻塞直到有输入。一旦你输入了一些东西,它就会进入循环,执行第一个打印语句,获取输入,打印第二个语句,然后等待下一个输入。

另一个问题是您在阅读x2 之前检查hasNext() 而不是x1 之前。试试这个结构:

System.out.println("Enter x1 or <crtl + z> to quit");
while (input.hasNext()) {
    double x1 = input.nextDouble();

    System.out.println("Please input the x2 number:");
    double x2 = input.nextDouble();

    //...

    System.out.println("Enter x1 or <crtl + z> to quit");
}

【讨论】:

  • 非常感谢大家的回复!它现在可以工作(除了正确退出,但我会继续努力)。
【解决方案2】:

您需要更正您的代码:

import java.util.Scanner;

public class DistanceFinder {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.println("Enter x1 or <crtl + z> to quit");

        while (input.hasNext()) {
            double x1 = input.nextDouble();

            System.out.println("Please input the x2 number:");
            double x2 = input.nextDouble();

            System.out.println("Please input the y1 number:");
            double y1 = input.nextDouble();

            System.out.println("Please input the y2 number:");
            double y2 = input.nextDouble();

            double x3 = 0;
            double y3 = 0;
            double xy1 = 0;

            x3 = Math.pow((x2 - x1), 2);
            y3 = Math.pow((y2 - y1), 2);

            xy1 = x3 + y3;

            double distance = Math.sqrt(xy1);

            System.out.printf("Distance is %.6f %n%n%n", distance);

            System.out.println("Enter x1 or <crtl + z> to quit");
        }
        input.close();
    }
}

输出:

Enter x1 or <crtl + z> to quit
1
Please input the x2 number:
2
Please input the y1 number:
1
Please input the y2 number:
3
Distance is 2.236068 


Enter x1 or <crtl + z> to quit
1
Please input the x2 number:
2
Please input the y1 number:
1
Please input the y2 number:
3
Distance is 2.236068 


Enter x1 or <crtl + z> to quit

【讨论】:

  • 所以按 ctrl-z Enter x1 or &lt;crtl + z&gt; to quit Exception in thread "main" java.util.NoSuchElementException at java.util.Scanner.throwFor(Scanner.java:907) at java.util.Scanner.next(Scanner.java:1530) at java.util.Scanner.nextDouble(Scanner.java:2456) at Main.main(Main.java:22)
  • 第二轮也不起作用 - 基本上按照我最初的评论,使用hasNext 没有好处
  • Enter x1 or &lt;crtl + z&gt; to quit 1 Please input the x2 number: 2 Please input the y1 number: 3 Please input the y2 number: 4 Distance is 1.414214 Enter x1 or &lt;crtl + z&gt; to quit 2 2 Please input the x2 number: 2 Please input the y1 number: 2 Please input the y2 number: 2 Distance is 0.000000 Enter x1 or &lt;crtl + z&gt; to quit
  • 第二次需要五个输入,如果在循环结束时按下 ctrl-z,您会收到可怕的异常消息
  • @ScaryWombat:感谢您的关注!我已经更正了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 2013-03-09
  • 2013-11-25
  • 1970-01-01
相关资源
最近更新 更多