Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 资源泄漏:';在';这家店从不关门_Java_Eclipse_Input_Resources_Memory Leaks - Fatal编程技术网

Java 资源泄漏:';在';这家店从不关门

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

为什么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 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.