Java 资源泄漏:';在';这家店从不关门
为什么Eclipse在下面的代码中给了我“资源泄漏:'in'永不关闭”的警告Java 资源泄漏:';在';这家店从不关门,java,eclipse,input,resources,memory-leaks,Java,Eclipse,Input,Resources,Memory Leaks,为什么Eclipse在下面的代码中给了我“资源泄漏:'in'永不关闭”的警告 public void readShapeData() { Scanner in = new Scanner(System.in); System.out.println("Enter the width of the Rectangle: "); width = in.nextDouble(); System.out.println("Enter the
public void readShapeData() {
Scanner in = new Scanner(System.in);
System.out.println("Enter the width of the Rectangle: ");
width = in.nextDouble();
System.out.println("Enter the height of the Rectangle: ");
height = in.nextDouble();
因为你没有关闭扫描仪
in.close();
使用完扫描仪后,您应该:
in.close();
通常,处理I/O的类的实例应该在完成后关闭。因此,您可以在代码末尾添加
in.close()
它告诉您需要使用Scanner.close()
关闭在System.in
上实例化的扫描仪。通常每个读卡器都应该关闭
请注意,如果在中关闭系统,您将无法再次从中读取。你也可以看看这门课
扫描仪应该关闭。关闭读卡器、流…和这类对象以释放资源和避免内存泄漏是一种很好的做法;并在finally块中执行此操作,以确保即使在处理这些对象时发生异常,它们也会关闭。正如其他人所说,您需要在IO类上调用“close”。我要补充的是,这是一个很好的使用try-finally块而不使用catch的地方,如下所示:
public void readShapeData() throws IOException {
Scanner in = new Scanner(System.in);
try {
System.out.println("Enter the width of the Rectangle: ");
width = in.nextDouble();
System.out.println("Enter the height of the Rectangle: ");
height = in.nextDouble();
} finally {
in.close();
}
}
这可以确保扫描仪始终处于关闭状态,从而确保正确的资源清理
同样,在Java 7或更高版本中,您可以使用“try with resources”语法:
我通过将in声明为私有静态Scanner类变量来修复它。不确定为什么会这样做,但eclipse建议我这样做。您需要在.close()中调用,最后在块中调用,以确保它发生
从Eclipse文档中,以下是它标记此特定问题的原因(emphasismine):
实现接口的类java.io.Closeable(自JDK 1.5以来)
和java.lang.AutoCloseable(自JDK 1.7以来)被认为是
表示应使用方法关闭的外部资源
不再需要时关闭()
EclipseJava编译器能够分析是否使用
类型遵守此策略
编译器将用“资源泄漏:流从未关闭”标记[违规]
完整说明。在中添加专用静态扫描仪代码>并不能真正解决问题,它只是清除警告。
使扫描器保持静态意味着它永远保持打开状态(或者直到类被卸载,这几乎是“永远”)。
编译器不再给你任何警告,因为你告诉他“永远打开它”。但这并不是您真正想要的,因为您应该在不再需要资源时尽快关闭它们
嗯,,
Manfred.如果您使用的是JDK7或JDK8,可以使用try catch with resources。这将自动关闭扫描仪
try ( Scanner scanner = new Scanner(System.in); )
{
System.out.println("Enter the width of the Rectangle: ");
width = scanner.nextDouble();
System.out.println("Enter the height of the Rectangle: ");
height = scanner.nextDouble();
}
catch(Exception ex)
{
//exception handling...do something (e.g., print the error message)
ex.printStackTrace();
}
它将关闭扫描仪
并关闭警告
Scanner sc = new Scanner(System.in);
//do stuff with sc
sc.close();//write at end of code.
上面的行将使用参数System.in调用Scanner类的构造函数,并将返回对新构造对象的引用
它连接到一个连接到键盘的输入流,所以现在在运行时您可以接受用户输入来执行所需的操作
//Write piece of code
要清除内存泄漏,请执行以下操作:
in.close();//write at end of code.
好吧,说真的,至少在很多情况下,这实际上是一个bug。它也出现在VS代码中,是linter注意到您已经到达封闭范围的末尾,而没有关闭scanner对象,但没有意识到关闭所有打开的文件描述符是进程终止的一部分。没有资源泄漏,因为资源在终止时已全部清理完毕,进程将消失,资源将无处保留。这将关闭扫描仪并使警告静音,但它也将关闭系统。
这通常是不可取的。@StuartCook+1。需要注意的东西。为什么我们需要关闭扫描仪?“资源泄漏”是什么意思?@nogard:你的回答真的很有帮助。。但是当我使用in.close()时;。。它再次显示为无法解决。。我有一个没有异常处理的代码。。thanks@StuartCook,您忘了提到为什么关闭系统中的通常是不可取的。那是因为你再也读不到了。即。例如,如果尝试调用(新扫描仪(System.in)).nextLine()
,您将得到java.util.NoSuchElementException:找不到任何行,这可能是开发过程中的一个难题。资源泄漏是什么意思?它将如何影响我?@Borat-“资源泄漏”意味着一些系统资源(通常是内存)正在不必要地丢失或浪费。通常,当您开始摆脱程序正常运行期间抛出的内存错误时,这会对您产生影响。谢谢eric。我知道,在无限循环中向自身附加字符串可能会导致错误。我不确定扫描器是如何导致这个错误的。那么试试资源呢?谢谢丹尼斯,补充道。你把警告静音了,但造成了资源泄漏。这个答案实际上帮助OP知道为什么他应该关闭这个东西。当然,他可以阅读文档并查看“scanner.close()
”,但这个答案确实帮助他/她了解发生了什么1请注意,catch条款不是强制性的。如果您只是想确保即使在发生异常的情况下也关闭资源,但将异常的处理保留为OP的原始代码中的处理方式(即,完全不捕获),您可以只使用try
,如图所示,而不使用catch
子句。
in.close();
scannerObject.close();
Scanner sc = new Scanner(System.in);
//do stuff with sc
sc.close();//write at end of code.
// An InputStream which is typically connected to keyboard input of console programs
Scanner in= new Scanner(System.in);
//Write piece of code
in.close();//write at end of code.