如何打破涉及hasNextLine()的while循环?

时间:2019-02-26 08:07:51

标签: java while-loop infinite

我有一组双精度值,可以通过调用属于Customer类的方法getArrivalTime()来检索它们。当我运行此while循环时,由于无法退出循环,因此无法打印输出。

while (sc.hasNextLine()) {

      Customer customer = new Customer(sc.nextDouble());

      String timeToString = String.valueOf(customer.getArrivalTime());

      if (!(timeToString.isEmpty())) {
        c.add(customer);
      } else {
        break;
      }
}

例如

输入:

0.500
0.600
0.700

我已经在循环末尾添加了break;。还有什么可以做的?

3 个答案:

答案 0 :(得分:2)

如果您将输入读取为字符串,然后将其解析为双精度字,则可以在空白行处使循环中断。

while (sc.hasNextLine()) {
    String line = sc.nextLine();
    if (line.isEmpty()) {
        break;
    }
    c.add(new Customer(Double.parseDouble(line)));
}

或者,您可以在现有代码中使用hasNextDouble()代替hasNextLine()。混合使用hasNextLine()nextDouble()是错误的。

答案 1 :(得分:0)

我猜您正在使用Scanner。 您正在逐行进行迭代。因此,请不要调用nextDouble,而要nextLine然后将您的行解析为Double。

这是简化版:

import java.util.Scanner;

public class Snippet {
    public static void main(String[] args) {

        try (Scanner sc = new Scanner("0.500\r\n" + "0.600\r\n" + "0.700");) {
            while (sc.hasNextLine()) {
                String line = sc.nextLine();
                double customer = Double.parseDouble(line);
                System.out.println(customer);
            }
        }
    }
}

否则,如果文件格式与双精度模式匹配(取决于您的语言环境...),则可能需要将hasNextDoublenextDouble结合使用:

导入java.util.Scanner;

公共课程摘录{     公共静态void main(String [] args){

    try (Scanner sc = new Scanner("0,500\r\n" + "0,600\r\n" + "0,700");) {
        while (sc.hasNextDouble()) {
            double customer = sc.nextDouble();
            System.out.println(customer);
        }
    }
}

}

HTH!

答案 2 :(得分:0)

如果您不想像使用goto这样的操作,则可以随时向您boolean添加一个while标志条件。

boolean flag = true;
while (sc.hasNextLine() && flag) {

      Customer customer = new Customer(sc.nextDouble());

      String timeToString = String.valueOf(customer.getArrivalTime());

      if (!(timeToString.isEmpty())) {
        c.add(customer);
      } else {
        flag = false;
      }
}