我不知道该怎么理解:
{
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正在关闭?
发布于 2016-08-21 11:53:29
这意味着,每当try块完成(成功与否)时,它将尝试关闭finally块中的流(inputStream和outputStream),但由于try块在创建BufferedReader或PrintWriter实例时可能失败,因此需要首先检查它是否不是null,否则将得到NPE。
您可以考虑使用try-with-resouces语句来避免检查null和显式调用close()是否会大大简化代码。
try (BufferedReader inputStream = new BufferedReader(new FileReader("xanadu.txt"));
PrintWriter outputStream = new PrintWriter(new FileWriter("characteroutput.txt")) {
// your code here
}发布于 2016-08-21 11:55:03
如果您在问为什么这些代码在finally块中,那么,
这只是为了确保inputStream和outputStream始终关闭,不管上面的代码是否遇到异常。
,它有什么不同?
区别是在任何例外情况下。如果出现任何异常,那么它将确保在将异常返回到调用此方法的方法之前关闭两个流,而不是简单地返回。
finally块总是会被执行,除非:
System.exit被称为--这是关闭finally块中的流、数据库或任何其他类似连接的常见实践。这可以确保连接始终关闭。因为如果它们没有处于最后的阻塞状态,并且系统不断地遇到一些或另一个Excpetion,那么它最终将耗尽连接。
发布于 2016-08-21 11:54:49
这只是为了避免空指针异常。只有当对象不是null时才调用这些函数。
简单地说,只有当对象不是null时才调用close函数--如果对具有空值的对象调用close(),则会遇到null pointer exception。
有趣的是finally的使用,它总是被称为是否有异常。
https://stackoverflow.com/questions/39063865
复制相似问题