黑马程序员技术交流社区

标题: 关于FileWriter的异常问题。 [打印本页]

作者: 刘源    时间: 2012-7-21 15:49
标题: 关于FileWriter的异常问题。
本帖最后由 刘源 于 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());这个语句没有执行到。
作者: 王飞    时间: 2012-7-21 15:57
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());
                }
                        
                }
        }
}


作者: 刘源    时间: 2012-7-21 16:04
fw2.close();是在try中的,所以没有关闭成功也会跑出一场,于是执行下面的catch
就是因为没有执行才奇怪啊,你看我异常打印都没有"close::::::"这个东西。
作者: 李伟    时间: 2012-7-21 16:37
因为空指针异常不是IOException,所以finally里的catch语句里的IOException应该改成Exception
                finally
                {
                        try
                        {
                               
                                //if(fw2!=null)
                                        fw2.close();
                                 
                        }
                        catch (Exception e)
                        {
                                System.out.println("close::::::"+e.toString());
                        }
                        
                }
作者: 王宝康    时间: 2012-7-21 16:41
楼主,首先,第一个异常是因为你在一个不存在的地址上创建一个文件,会抛出异常;
      其次,你的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:02
哦,谢谢搞定了。
作者: 王璐    时间: 2012-7-21 17:17


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

当添加if(fw2!=null)语句后,有条件判断,fw2.close()并没有执行,也就不会产生空指针异常。
后面的catch没有捕获到异常,处理语句也就不会执行。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2