你好我的同事们。
我有一些代码,弹簧工具套件编辑器也有不同的反应,也许你们中的一些聪明人知道原因。
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中使用了一个应该总是关闭我的对象,如果它不为空。
提前谢谢。
答案 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的方法。