当用户按下^ Z时如何退出循环

时间:2015-08-29 00:12:43

标签: java

import java.util.Scanner;
import java.math.*;
public class Question2
{

    public static void main(String[] args)
    {

        double radius;
        double area;
        Scanner keyboard = new Scanner(System.in);

        do
        {
            System.out.println("Please enter a radius.");
            radius = keyboard.nextDouble();

            // Calculate area of the circle using PI and radius
            area = Math.PI * Math.pow(radius, 2);

            // Output area of the circle
            System.out.println("The area with a radius of " + radius +" is " + area);


        }while(keyboard.hasNext());

    }

我可以使用^Z退出循环。问题是当我想再迭代一些时。当程序到达keyboard.hasNext()时我按下输入没有任何反应所以当我按下一个数字时。跳过下一个迭代radis= keyboard.nextDouble()语句,因为该数字在我假设的缓冲区中。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

你在这里稍微有些误解。你有一个do {} while();循环,这基本上是做某事,然后检查语句,然后再做一次。

现在,问题是,你正在进入循环,并调用Scanner.nextDouble()。扫描仪等待,直到它有一些东西要处理(这是它的第一个工作原因时间。),如果它有这个信息(你输入的那一刻)。
它会开始。但之后,扫描仪中没有任何内容,因此Scanner.hasNext()返回false并退出循环,从而退出程序。

因此,不是检查是否有东西,而是一直循环并从扫描仪中读取。 由于next()方法阻止,我们不需要测试其中是否有任何内容。

这样的事情可以解决问题:

public static void main(String[] args) {
    double r;
    double a;
    String str;
    Scanner s = new Scanner(System.in);

    while (true) {
        System.out.print("please give me a radius: ");
        str = s.nextLine();

        try {
            r = Double.parseDouble(str);
        } catch (NumberFormatException ex) {
            break;
        }

        a = Math.PI * r * r;
        System.out.printf("area of a circle with a radius of %f is: %f%n", r, a);
    }
}

答案 1 :(得分:0)

我看到的第一件事是

while(keyboard.hasNext());

应该是

while(keyboard.hasNextDouble());

我还希望在最有限的范围内定义变量(用于优化,并保持名称空间打开)。接下来,我建议使用带有printf的格式化输出,而不是使用连接构建String。你可以取消对Math.pow的号召。像,

public static void main(String[] args) {
    Scanner keyboard = new Scanner(System.in);
    do {
        System.out.println("Please enter a radius.");
        double radius = keyboard.nextDouble();

        // Calculate area of the circle using PI and radius
        double area = Math.PI * radius * radius;

        // Output area of the circle
        System.out.printf("With a radius of %f the area is %f.%n", radius,
                area);
    } while (keyboard.hasNextDouble());
}