登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[java] exception  

2009-05-26 09:51:56|  分类: lang_java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
源于《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 中最清爽的办法就是抛异常。
  评论这张
 
阅读(817)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018