扫描器 useLocale 资源泄漏

Scanner useLocale Resource leak

各位程序员大家好。

我有一些代码,spring 工具套件编辑器也有不同的响应,也许你们中的一些聪明人知道为什么。

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)

第一行代码给了我一个警告 "Resource leak: unassigned closeable value is never closed",正如你所看到的,我在我的 try/catch 中使用了一个 finally,如果它不为空,它应该总是关闭我的对象。

提前致谢。

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

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

毫无根据的警告,您可以忽略。

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 的方法。