Java 资源泄漏';空白';永不关闭

Java 资源泄漏';空白';永不关闭,java,java.util.scanner,resource-leak,Java,Java.util.scanner,Resource Leak,当我创建扫描仪时,似乎出现了这个错误。我试图通过搜索错误名称来解决此问题,但到目前为止,未能使消息停止出现 代码: 这是因为您从未关闭扫描仪。将代码更改为: Scanner k = null; try { k = new Scanner(System.in); //do stuff with k here... } finally { if( k != null ) k.close(); } 这似乎是警告而不是错误。然而,解决这个问题是一个很好的做法 实

当我创建扫描仪时,似乎出现了这个错误。我试图通过搜索错误名称来解决此问题,但到目前为止,未能使消息停止出现

代码:


这是因为您从未关闭
扫描仪。将代码更改为:

Scanner k = null;
try {
    k = new Scanner(System.in);
    //do stuff with k here...
} finally {
    if( k != null )
        k.close();
}

这似乎是警告而不是错误。然而,解决这个问题是一个很好的做法

实际上,您只需调用
k.close()。
最佳实践是在finally块中调用
close
:这保证了无论是否抛出异常,资源都是关闭的

Scanner k = null;
try {
    k = new Scanner(System.in);
    ........
} finally {
    if (k != null) {
        k.close();
    }
}
幸运的是,java 7提供的语法使该语法不那么冗长:

try (
    Scanner k = new Scanner(System.in);
) {
    .... // use k
} 

当实现
Closable
的任何类的对象在
try
块的特殊部分中创建时,您不必编写
最后的
块:它是由编译器添加的

这是我不太明白的部分。是什么使扫描仪永远无法关闭。我看不出我在这个程序中所做的与其他任何有扫描仪的程序有什么不同。许多程序员经常忘记这样做(包括我自己很长一段时间)。但是,使用try finally正确清理资源是您始终需要做的事情,即使没有它,您的程序看起来也很好;然后转到最后一次使用扫描仪对象?
Scanner k = null;
try {
    k = new Scanner(System.in);
    ........
} finally {
    if (k != null) {
        k.close();
    }
}
try (
    Scanner k = new Scanner(System.in);
) {
    .... // use k
}