2016-11-11 35 views
2

我有如下因素代码:parseDouble VS nextDouble

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

与输入:阅读此输入,而之后

1.1 
2.2 
3.3 

程序停止,因为我认为,它应该仍然输入读取。 这是为什么?

+0

因为它不知道你已经完成输入数字。关闭流(例如按下Ctrl-D) –

+0

不,它在读入这个输入后停止,它应该仍然按照我的猜测读 – Xander

+0

但是如果你不关闭流,它不知道没有任何东西出现,所以它只是等待。 [这里工作正常](http://ideone.com/y19u7S)。 –

回答

4

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

要解决这个问题,您应该统一从输入中读取/解析双精度的方法,并且还要决定要使用哪个分隔符。
可以通过使用设置分离器的类型,例如:
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() is true w这里是Double.parseDouble(in.nextLine()) throws NumberFormatException。

希望它有帮助。

+1

谢谢你的回答,我会尝试它 – Xander

相关问题