只需从Python切换到Java,并且在读取用户输入时遇到一些问题。 我在以下代码中有两个问题: (1)关闭扫描仪后为什么不能正常工作(如果跳过后关闭,是不是有问题?) (2)为什么两个简单数字的总和导致回答不准确3.0300000000000002?
import java.util.Scanner;
public class HelloWorld {
public static void main(String[] args) {
String s1 = getInput("Enter a numeric value: ");
String s2 = getInput("Enter a numeric value: ");
double d1 = Double.parseDouble(s1);
double d2 = Double.parseDouble(s2);
double result = d1 + d2;
System.out.println("The answer is: " + result);
}
private static String getInput(String prompt){
System.out.print(prompt);
Scanner scan = new Scanner(System.in);
String input = "DEFAULT";
try{
input = scan.nextLine();
}
catch (Exception e){
System.out.println(e.getMessage());
}
//scan.close();
return input;
}
}
这是评论扫描关闭的输出:
Enter a numeric value: 1.01
Enter a numeric value: 2.02
The answer is: 3.0300000000000002 (weird output)
如果我取消注释scan.close(),则无法在第二个数字中键入int并附加错误消息:
Enter a numeric value: 1.01
Enter a numeric value: No line found
Exception in thread "main" java.lang.NumberFormatException: For input string: "DEFAULT"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1241)
at java.lang.Double.parseDouble(Double.java:540)
at HelloWorld.main(HelloWorld.java:10)
如果你们中的任何一个人能指出我正确的地方,或者给我一些关于这两个问题是如何产生的提示,我们将不胜感激!
答案 0 :(得分:2)
在第一次输入结束时,您关闭 流。您关闭的流是“标准输入流”。当您致电Scanner
时,close()
会关闭基础流。
首次调用getInput(String)
方法后,所有尝试从“标准输入流”读取的操作都将失败。
捕获Exception
很糟糕。当它无法读取流时,您返回"DEFAULT"
。 Double.parseDouble(..)
抱怨错误的字符串。
答案 1 :(得分:1)
关闭扫描仪将关闭基础流。在你的情况下System.in。在第二次调用getInput时,您的代码会爆炸。 考虑使用Singleton模式存储扫描程序的单个实例。