在 java 中使用 SuppressWarnings

Usage of SuppressWarnings in java

我正在使用 java 中的文件,我的 IDE 是 VS-Code.The 问题我面临的是它显示以下警告以及其他警告-

Resource leak: 'sc' is never closed
Resource leak: 'scan' is never closed

其中“sc”定义为 -

Scanner sc = new Scanner(System.in); 

和“扫描”为 -

File fobj=new File("Marks.txt");
Scanner scan = new Scanner(fobj);

我问的是使用 @SuppressWarnings("resources") 仅阻止来自扫描器对象 sc.Is 的警告 有任何方法可以阻止所有这些可以在 [=26= 开头定义的开放资源警告] 文件,因为我必须在我写的每个 class 中包含 @SuppressWarnings("resources")。

您可以向包含 class:

添加抑制
@SuppressWarnings("resources")
class YourClass {
  // ...
}

这将在 class.

中抑制 所有 资源警告

但这不是一个好主意,因为它还会抑制有关您确实想要关闭的资源的警告,例如scan.

如果您担心在出现警告的所有地方添加抑制,我会说您遇到了更深层次的问题,因为这意味着您在很多地方都收到了警告。

就抑制 Scanner sc = new Scanner(System.in); 上的警告而言:您应该只在流上创建一个扫描器,因此,您应该只需要在一个地方添加抑制。

如果您在 System.in 上创建多个扫描器,您可能会从中得到意想不到的结果,请考虑每个扫描器可能会消耗部分输入流。更好的方法是构建一个扫描器(在给定的流上),然后传递它。

对于 Scanner scan,比抑制警告更好的方法是关闭流,因此没有要抑制的警告。 Try-with-resources 保证了这一点:

File fobj=new File("Marks.txt");
try (Scanner scan = new Scanner(fobj)) {
  // ... Do stuff with scan.
}
// And now it's guaranteed to be closed.

请注意,您可以在 new Scanner(System.in) 附近使用 try-with-resources,它保证会关闭 - 但您不应该关闭。关闭 Scanner 会关闭基础流 - System.in.

您应该只关闭您的代码直接打开的流 - 您的代码不会打开 System.in,JVM 会打开。 System.in 一旦关闭就无法重新打开,因此您可能会不小心破坏代码的其他部分,这些部分假定它会打开。

您必须分别考虑 System.in 和“其他”流,这很糟糕 - Scanner(等)中子流的“有用”关闭是先于 try-with- 的行为资源语法,所以它只是 Java 坚持的东西。