扫描关闭导致麻烦所以我应该保持未关闭?

时间:2013-07-21 18:28:12

标签: java double

只需从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)

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

2 个答案:

答案 0 :(得分:2)

在第一次输入结束时,您关闭 流。您关闭的流是“标准输入流”。当您致电Scanner时,close()会关闭基础流。

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

捕获Exception很糟糕。当它无法读取流时,您返回"DEFAULT"Double.parseDouble(..)抱怨错误的字符串。

答案 1 :(得分:1)

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