[java] exception
2009-05-26 09:51:56| 分类:
lang_java
| 标签:
|举报
|字号大中小 订阅
源于《Practical Java》实践16~27
遮掩异常
虽然 finally 可以用于释放资源,但也可能导致遮掩异常(hide an exception)。
public void readFile() throws FileNotFoundException, IOException
{
BufferedReader br1 = null;
BufferedReader br2 = null;
FileReader fr = null;
try {
fr = new FileReader("data1.fil"); //1
br1 = new BufferedReader(fr);
int i = br1.read(); //2
// Other code...
fr = new FileReader("data2.fil"); //3
br2 = new BufferedReader(fr);
i = br2.read(); //4
// Other code...
}
finally {
if (br1 != null)
br1.close(); //5
if (br2 != null)
br2.close(); //6
}
}
//1, //3 有可能抛出 FileNotFoundException, 而 //2, //4, //5, //6 有可能 IOException。如果在 //3 抛出了异常,而逻辑执行到 //5 的时候又抛出了异常,则调用者只能受到 IOException,而并不知道 //3 的 FileNotFoundException。此称为 hide an exception。
解决方法,就是再弄个 class,把所有出现的异常都丢出去。
class ReadFileExceptions extends IOException
{
private Vector excVector;
public ReadFileExceptions(Vector v)
{
excVector = v;
}
public Vector exceptionVector()
{
return excVector;
}
}
public void readFile() throws ReadFileExceptions
{
BufferedReader br1 = null;
BufferedReader br2 = null;
FileReader fr = null;
Vector excVec = new Vector(2);
try {
fr = new FileReader("data1.fil");
br1 = new BufferedReader(fr);
int i = br1.read();
// Other code...
fr = new FileReader("data2.fil");
br2 = new BufferedReader(fr);
i = br2.read();
// Other code...
}
catch (FileNotFoundException fnfe) {
excVec.add(fnfe);
}
catch (IOException ioe) {
excVec.add(ioe);
}
finally {
if (br1 != null)
{
try { br1.close(); }
catch (IOException e) { excVec.add(e); }
}
if (br2 != null)
{
try { br2.close(); }
catch (IOException e) { excVec.add(e); }
}
if (excVec.size() != 0)
throw new ReadFileExceptions(excVec);
}
}
异常是全部丢出去了,不过感觉代码也不清爽,卡卡。
构造函数
对于构造函数过程中出错,java 中最清爽的办法就是抛异常。
评论这张
转发至微博
转发至微博
评论