扫描仪useLocale资源泄漏

时间:2017-09-13 11:35:54

标签: java java.util.scanner spring-tool-suite resource-leak

你好我的同事们。

我有一些代码,弹簧工具套件编辑器也有不同的反应,也许你们中的一些聪明人知道原因。

File inputFile = new File(System.getProperty("user.home") + "/Desktop/Input.txt");
    Scanner sc = null;
    double payment=0;
    try {
        sc = new Scanner(inputFile).useLocale(Locale.ENGLISH);
        //sc = new Scanner(inputFile)
        //sc.useLocale(Locale.ENGLISH);
        payment = sc.nextDouble();
    } catch (Exception e) {
    } finally {
        if (sc != null) {
            sc.close();
        }
    }

有人可以告诉我为什么这是不可能的:

Scanner sc = new Scanner(inputFile).useLocale(Locale.ENGLISH);

但这是!?

Scanner sc = new Scanner(inputFile);
sc.useLocale(Locale.ENGLISH)

第一行代码给了我一个警告"资源泄漏:未分配的可关闭值永远不会关闭",你可以看到我在我的try / catch中使用了一个应该总是关闭我的对象,如果它不为空。

提前谢谢。

2 个答案:

答案 0 :(得分:1)

这是编译器警告你不能(或者不能)理解的东西。

调用useLocale()时,将返回调用它的同一Scanner实例。但是编译器无法知道并发出警告。如果该方法返回了不同的Scanner对象,则资源泄漏将是有效的,因为原始Scanner对象将在不关闭的情况下消失。

无端警告,你可以忽略。

答案 1 :(得分:1)

Kayaman发现了一个问题。另一个是useLocale()调用可以(理论上 1 )抛出异常。如果发生这种情况,则不会分配sc ...并且Scanner不会被关闭。这是一个有保证的警告!

无论哪种方式,编写此代码的正确方法如下:

File inputFile = new File(....);
double payment = 0;
try (Scanner sc = new Scanner(inputFile)) {
    sc.useLocale(Locale.ENGLISH);
    payment = sc.nextDouble();
} catch (IOException e) {
    // Do something about it
}

请注意, try-with-resources 负责关闭,我不会抓住并压缩java.lang.Exception。 (捕获Exception很糟糕。压扁它更糟糕。)

此版本的代码行数较少。更简洁更正确==大赢!

1 - 我查看了源代码,我可以看到在useLocale()调用中可以获得NPE或OOME的方法。