美文网首页javaSE
对于finally代码块的抛出异常问题

对于finally代码块的抛出异常问题

作者: virtual灬zzZ | 来源:发表于2022-11-02 23:08 被阅读0次

    有以下的例子

    public static void throwException(){
            File file = null;
            FileInputStream fis = null;
            try{
                file = new File("abc.txt");
                //可能抛出FileNotFoundException
                fis = new FileInputStream(file);
                fis.read();
            }catch(FileNotFoundException e){
                System.out.println("file not found");
                e.printStackTrace();
            }catch(IOException e){
                e.printStackTrace();
            } finally{
                //这里存在一个的异常,需要进行处理
                fis.close();
            }
        }
    

    继续按照IDEA的提示处理,再次catch操作,代码会变为这样:

    public static void throwException(){
            File file = null;
            FileInputStream fis = null;
            try{
                file = new File("abc.txt");
                //可能抛出FileNotFoundException
                fis = new FileInputStream(file);
                fis.read();
            }catch(FileNotFoundException e){
                System.out.println("file not found");
                e.printStackTrace();
            }catch(IOException e){
                e.printStackTrace();
            } finally{
                //这里存在一个的异常,需要进行处理
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
    

    但是在Java核心技术书中,作者建议在finally块中尽量不要使用会抛出异常的资源回收语句。
    也就是这里的close操作尽量不要出现异常,可是有些资源回收语句确实会抛出异常,此时应该怎么做呢?

    我们可以观察到close操作抛出的异常是IOException,而前面的文件读取流也catch了该异常,所以我们可以将两个异常归并到一起,然后代码就变成这样了:

    public static void throwException(){
            File file = null;
            FileInputStream fis = null;
            try{
                try {
                    file = new File("abc.txt");
                    //可能抛出FileNotFoundException
                    fis = new FileInputStream(file);
                    fis.read();
                }  finally {
                    fis.close();
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    

    如果你认为是没有异常了,那我们执行一下看:


    我们可以看到这里抛出空指针异常,分析代码我们可以发现fis可能为空,所以需要在close之前去判断一下它,防止出现空指针这样的异常。Ps:其实也可以在最后加个catch块,用对应的exception或直接用Exception去接,也是能接到的。

    public static void throwException(){
            File file = null;
            FileInputStream fis = null;
            try{
                try {
                    file = new File("abc.txt");
                    //可能抛出FileNotFoundException
                    fis = new FileInputStream(file);
                    fis.read();
                }  finally {
                    if(fis != null){
                        fis.close();
                    }
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    

    相关文章

      网友评论

        本文标题:对于finally代码块的抛出异常问题

        本文链接:https://www.haomeiwen.com/subject/yezetdtx.html