java - 扫描关闭会造成麻烦,所以我应该不关闭它吗?

标签 java double

刚从 Python 切换到 Java,在读取用户输入时遇到了一些问题。 我在以下代码中有两个问题: (1) 为什么我关闭scanner后不能正常工作(如果是skip close,是不是有问题?) (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)

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

最佳答案

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

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

捕获 Exception 是不好的。当它无法读取流时,您返回 "DEFAULT"Double.parseDouble(..) 提示字符串错误。

关于java - 扫描关闭会造成麻烦,所以我应该不关闭它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17775499/

相关文章:

r - R 是否在内部将数字视为 double ?

java - 这里的继承是如何实现的呢?

c# - 单元测试是否可以通过接受 boolean 值作为开关来执行双重任务,或者我应该编写两个单独的测试来复制测试代码吗?

java - 让第二辆车随机颜色不同JAVA

java - android smali 编辑 : low bits must be zero

c++ - 为什么看起来 cin 将我的 double 输入转换为整数? C++

c# - 将带逗号的字符串转换为 double 和 int 是不同的。为什么?

cuda - 如何找到 CUDA 的 epsilon、min 和 max 常量?

java - <t :selectOneRadio link to backbean problem

java - 我正在尝试将多个paintComponents 放置在JFrame 中。