【发布时间】:2011-03-03 22:30:09
【问题描述】:
我正在编写一个连接到网站并从中读取一行的应用程序。我是这样做的:
try{
URLConnection connection = new URL("www.example.com").openConnection();
BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String response = rd.readLine();
rd.close();
}catch (Exception e) {
//exception handling
}
好吃吗?我的意思是,我在最后一行关闭了 BufferedReader,但我没有关闭 InputStreamReader。我是否应该从 connection.getInputStream 创建一个独立的 InputStreamReader,从独立的 InputStreamReader 创建一个 BufferedReader,而不是关闭所有两个阅读器? 我认为像这样将关闭方法放在 finally 块中会更好:
InputStreamReader isr = null;
BufferedReader br = null;
try{
URLConnection connection = new URL("www.example.com").openConnection();
isr = new InputStreamReader(connection.getInputStream());
br = new BufferedReader(isr);
String response = br.readLine();
}catch (Exception e) {
//exception handling
}finally{
br.close();
isr.close();
}
但是很丑,因为关闭方法可以抛出异常,所以我必须处理或抛出它。
哪种解决方案更好?或者最好的解决方案是什么?
【问题讨论】:
-
您的代码在 finally 子句中实际上有一个小问题。
isr和br在 finally 子句中可能仍然是null,因为InputStreamReader和BufferedReader构造函数可能会抛出异常。您应该将 finally 子句更改为:finally { if (br != null) br.close(); if (isr != null) isr.close(); }。这仍然不正确,因为br.close()可能会引发异常,因此isr在这种情况下根本不会关闭。安德烈亚斯的回答似乎是遵循恕我直言的方式。 -
除非你知道原因,否则永远不要赶上
Exception
标签: java url exception-handling inputstream