我有以下代码:

Scanner in = new Scanner(System.in);
while (in.hasNextDouble()) {
    System.out.println(Double.parseDouble(in.nextLine()));
}

输入:
1.1
2.2
3.3

程序在读取此输入后停止,但据我推测,它仍应从输入中读取。
这是为什么?

最佳答案

问题可能是您的默认语言环境使用逗号作为分隔符。
Double.parseDouble()-始终使用点作为分隔符。
in.nextDouble()-使用您的语言环境指定的分隔符。
结果是这些方法之一可以使用逗号作为分隔符,而另一种方法可以使用点。

要解决该问题,您应该统一从输入中读取/解析double的方法,并确定要使用的分隔符。
您可以设置分隔符的类型,例如,使用:
  1.点分隔符:

Scanner in = new Scanner(System.in);
in.useLocale(Locale.ENGLISH);


要么:

Scanner in = new Scanner(System.in);
in.useDelimiter("\\.");


2.逗号分隔符:

Scanner in = new Scanner(System.in);
in.useLocale(Locale.FRENCH);


要么

Scanner in = new Scanner(System.in);
in.useDelimiter(",");


因此,重构代码:

Scanner in = new Scanner(System.in);
in.useLocale(Locale.ENGLISH);
while (in.hasNextDouble()) {
    System.out.println(Double.parseDouble(in.nextLine()));
}



要清楚地看到问题,可以使用以下代码:

Locale.setDefault(Locale.FRANCE);
Scanner in = new Scanner(System.in);
System.out.println(in.hasNextDouble());
Double.parseDouble(in.nextLine());


输入:1,1

hasNextDouble()的结果为true,而Double.parseDouble(in.nextLine())引发NumberFormatException。

希望能帮助到你。

关于java - parseDouble vs nextDouble,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40551038/

10-11 03:40