您好我正在学习Java中的异常,我遇到了这种情况的问题。
public static void main(String[] args){
String path = "t.txt";
BufferedReader br = null;
try{
br = new BufferedReader(new FileReader(path));
StringBuilder sbd = new StringBuilder();
String line = br.readLine();
while(line != null){
sbd.append(line);
sbd.append(System.lineSeparator());
line = br.readLine();
}
String result = sbd.toString();
System.out.print(result);
}catch(IOException e){
System.out.println(e.getMessage());
}finally{
if (br != null)
br.close(); //Here it says unreported exception IOException; must be caught or declared to be thrown
}
}
当我调用方法close()关闭bufferedReader时,它表示未报告的异常IOException;必须被抓或宣布被抛出。
我知道JAVA 7提供了一种非常简单的方法来清理
try(br = new BufferedReader(new FileReader(path))){
//....
}
但在JAVA 7之前,我该怎么办?添加"抛出IOException"主函数声明旁边是一种修复它的方法,但它有点复杂,因为我有一个catch部分来捕获IOExceptions
答案 0 :(得分:3)
您将其包装到另一个try-catch
}finally{
if (br != null)
try {
br.close(); //Here it says unreported exception IOException; must be caught or declared to be thrown
} catch (Exception exp) {
}
}
现在,如果你关心与否是另一个问题。在我看来,你的目的是尽最大努力关闭资源。如果需要,可以使用flag并将其设置为父true
块中的catch
(表示应忽略任何后续错误),如果它在{{1}中为false
阻止,显示错误消息,例如......
catch
答案 1 :(得分:1)
在JAVA 7之前,我可以对这种情况做些什么呢?
您可以在try-catch
块中添加finally
,例如
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
// Handle the IOException on close by doing nothing.
}
}
}
答案 2 :(得分:0)
添加另一个try catch块
...
if(br != null)
try{
br.close();
} catch (IOException io){
}
答案 3 :(得分:0)
我通常会这样编码:
} finally {
if (br != null) {
try {
br.close();
} catch(IOException ioe) {
// do nothing
}
}
}
事实上,我曾经写过一个包含closeStream(final InputStream stream)
,closeStream(final OutputStream stream)
,closeReader(final Reader reader)
等方法的util类,它隐藏了所有这些东西,因为你最终一直在使用它
答案 4 :(得分:0)
这大致是资源试用关闭资源的方式
BufferedReader br = new BufferedReader(new FileReader(path));
IOException ex = null;
try {
br.read();
// ...
} catch(IOException e) {
ex = e;
} finally {
try {
br.close(); // close quietly
} catch (IOException e) {
if (ex != null) {
ex.addSuppressed(e);
} else {
ex = e;
}
}
}
if (ex != null) {
throw ex;
}