A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘源 中级黑马   /  2012-7-21 15:49  /  3775 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘源 于 2012-7-27 14:13 编辑

import java.io.*;
class FileWriterDemo2
{
        public static void main(String[] args)
        {
                FileWriter fw2 =null;
                try
                {
                        fw2 = new FileWriter("s:\\demo.txt");
                        fw2.write("LIUYUAN");
                        fw2.flush();
                        
                }
                catch (IOException io)
                {
                        System.out.println("new:::::::"+io.toString());
                }
                finally
                {
                        try
                        {
                                //if(fw2!=null)
                                        fw2.close();
                        }
                        catch (IOException io)
                {
                        System.out.println("close::::::"+io.toString());
                }
                        
                }
        }
}
此程序的异常是:
new:::::::java.io.FileNotFoundException: s:\demo.txt (系统找不到指定的路径。)
Exception in thread "main" java.lang.NullPointerException
        at FileWriterDemo2.main(FileWriterDemo2.java:23)
去掉//的异常是:
newjava.io.FileNotFoundException: s:\demo.txt (系统找不到指定的路径。)
我的问题是:
第一个异常抛出是fw2 = new FileWriter("s:\\demo.txt");语句引起的,
还是fw2 = new FileWriter("s:\\demo.txt");和fw2.close();这2个语句同时引起的。
如果只是一个引起的,为什么加了//if(fw2!=null)后,异常结果变了。
如果是两个语句引起的,为什么System.out.println("close::::::"+io.toString());这个语句没有执行到。

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

6 个回复

倒序浏览
import java.io.*;
class FileWriterDemo2
{
        public static void main(String[] args)
        {
                FileWriter fw2 =null;
                try
                {
                        fw2 = new FileWriter("s:\\demo.txt");---你有S盘???如果没有就是(系统找不到指定的路径。)
                        于是抛出异常,执行 :System.out.println("new:::::::"+io.toString());
                        下面的语句不会执行

                        fw2.write("LIUYUAN");
                        fw2.flush();
                        
                }
                catch (IOException io)
                {
                        System.out.println("new:::::::"+io.toString());
                }
                finally
                {
                        try
                        {
                                //if(fw2!=null)
                                        fw2.close();----此处由于fw2 = new FileWriter("s:\\demo.txt");没有执行成功,直接抛出异常了,所以此时的fw2还是null,所以调用fw2.close()时出错。
                        }  ---因为fw2.close();是在try中的,所以没有关闭成功也会跑出一场,于是执行下面的catch

                        catch (IOException io)
                {
                        System.out.println("close::::::"+io.toString());
                }
                        
                }
        }
}

回复 使用道具 举报
fw2.close();是在try中的,所以没有关闭成功也会跑出一场,于是执行下面的catch
就是因为没有执行才奇怪啊,你看我异常打印都没有"close::::::"这个东西。
回复 使用道具 举报
因为空指针异常不是IOException,所以finally里的catch语句里的IOException应该改成Exception
                finally
                {
                        try
                        {
                               
                                //if(fw2!=null)
                                        fw2.close();
                                 
                        }
                        catch (Exception e)
                        {
                                System.out.println("close::::::"+e.toString());
                        }
                        
                }
回复 使用道具 举报
楼主,首先,第一个异常是因为你在一个不存在的地址上创建一个文件,会抛出异常;
      其次,你的finally块中会产生异常,但是产生的是空指针异常,不是IO异常,你声明的是获取IO异常,所以获取不到IO异常,
            System.out.println("close::::::"+io.toString());不会被执行,你可以直接写
  1. catch(Exception e){
  2.               System.out.println("close::::::"+e.toString());
  3.         }
复制代码
这样就会出现你想要的结果了。
回复 使用道具 举报
哦,谢谢搞定了。
回复 使用道具 举报
王璐 中级黑马 2012-7-21 17:17:44
7#


第一个异常是fw2 = new FileWriter("S:\\demo.txt"); 产生的,catch捕获后进行处理,程序
继续执行,执行到fw2.close(),因为这时fw2是null,调用close()方法,产生
java.lang.NullPointerException空指针异常。

当添加if(fw2!=null)语句后,有条件判断,fw2.close()并没有执行,也就不会产生空指针异常。
后面的catch没有捕获到异常,处理语句也就不会执行。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马