1

只是从 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() 的注释,您将无法键入第二个数字并附加错误消息:

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)

如果你们中的任何人能指出我正确的地方或给我一些关于这两个问题是如何产生的提示,将不胜感激!

4

2 回答 2

2

在第一个输入结束时,关闭。您关闭的流是“标准输入流”。Scanner调用时关闭底层流close()

getInput(String)第一次调用您的方法 后,所有从“标准输入流”读取的尝试都将失败。

Exception是不好的。"DEFAULT"当它无法读取流时,您返回。Double.parseDouble(..)抱怨字符串不好。

于 2013-07-21T19:24:44.123 回答
1

关闭扫描器会关闭底层流。在你的情况下 System.in。在第二次调用 getInput 时,您的代码会爆炸。考虑使用 Singleton 模式来存储扫描仪的单个实例。

于 2013-07-21T18:42:20.477 回答