扫描器 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 的方法。
各位程序员大家好。
我有一些代码,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 的方法。