java最终{if(inputStream!=null){inputStream.close();
我不知道如何理解这一点:
{
if (inputStream **!= null**) {
inputStream.close();
从这个例子来看:
public class CopyLines {
public static void main(String[] args) throws IOException {
BufferedReader inputStream = null;
PrintWriter outputStream = null;
try {
inputStream = new BufferedReader(new FileReader("xanadu.txt"));
outputStream = new PrintWriter(new FileWriter("characteroutput.txt"));
String l;
while ((l = inputStream.readLine()) != null) {
outputStream.println(l);
}
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
}
}}
当提供任何数据时,inputStream正在关闭
# 1 楼答案
如果您询问为什么此代码位于
finally
块中,那么这只是为了确保
inputStream
和outputStream
始终处于关闭状态,不管上面的代码是否遇到异常有什么不同
任何例外情况下都会出现差异。如果发生任何异常,那么它将确保在将异常返回给调用此方法的方法之前关闭两个流,而不是简单地返回
bacause java的
finally
块始终执行,除非:System.exit
被调用这是关闭
finally
块中的流、数据库或任何其他类似连接的常见做法。这可确保连接始终处于关闭状态。因为如果它们不在finally块中,并且系统不断遇到一些或另一些Excpetion
,那么它最终将耗尽连接# 2 楼答案
这意味着每当try块完成时(无论成功与否),它都会尝试关闭
finally
块中的流(inputStream
和outputStream
),但由于try
块在创建BufferedReader
或PrintWriter
实例时可能会失败,您需要首先检查它是否为null
,否则您将获得NPE可以考虑使用^{} 语句来避免必须检查^ {< CD7>},并明确调用^ {CD10>},这样它可以简化代码很多。p>
# 3 楼答案
这只是为了避免空指针异常。仅当对象不是
null
时才调用函数简单地说,
close
函数仅在对象不为null时调用,否则如果在具有null值的对象上调用close()
,您将遇到null pointer exception
有趣的是
finally
的用法,无论是否存在异常,都会调用它# 4 楼答案
当执行到达finally块时,首先检查
inputstream
和outputstream
是否为null,然后关闭两个流以释放资源请参阅链接以检查有关最终试用的信息:https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.20.2