黑马程序员技术交流社区

标题: 复制文件 [打印本页]

作者: 黑马李刚    时间: 2011-9-3 19:21
标题: 复制文件
不做任何try,catch动作(仅在main(String args[])后添加throws IOException), 程序运行正常。try , catch 后编译通过,运行时报错:
Exception in thread "main" java.lang.NullPointerException
        at L.main(L.java:16)

代码如下:
[code=java]import java.io.*;
class L
{
        public static void main(String args[])
        {
                FileWriter fw=null;
                        
                FileReader fr=null;
                try
                {
                        new FileReader("L.java");
                    new FileWriter("mm.txt");
        
                        int len=0;
                        char[] buf=new char[1024];
                        while((len=fr.read(buf))!=-1)
                        {
                                fw.write(buf,0,len);
                        }
                }
                catch (IOException e)
                {
                         throw new RuntimeException("error");
                }
                finally
                {
                        if(fr!=null)
                                try
                                {
                                        fr.close();
                                }
                                catch (IOException e)
                                {
                                }
                        if(fw!=null)
                                try
                                {
                                        fw.close();
                                }
                                catch (IOException e)
                                {
                                }
                }        
        }
}[/code]
作者: 匿名    时间: 2011-9-3 20:03
哥们,你看清楚你的代码,new FileReader("L.java");new出来的没有给fr,所以fr这个时候还是null,你要读它,当然就空指针异常了,把new FileReader("L.java"); 改成fr = new FileReader("L.java"); fw = new FileWriter("mm.txt");这样就没问题了。
作者: 匿名    时间: 2011-9-3 23:16
编译通过,那是因为编译指示将你代码转换成.class二进制代码,并没有去执行你的程序,也不知道你用一个null去调用了某个方法,所以通过,运行时,fr一直是null值,不报错才怪
作者: 匿名    时间: 2011-9-3 23:27
代码给你重新写了下,fw、fr的问题[code]import java.io.*;
class L {        
        public static void main(String args[]){
                FileWriter fw=null;
                FileReader fr=null;
                try{
                        fr = new FileReader("L.java");
                        fw = new FileWriter("mm.txt");
                        int len=0;
                        char[] buf=new char[1024];
                        while((len=fr.read(buf))!=-1){
                                fw.write(buf,0,len);
                        }      
                }catch (IOException e){
                        throw new RuntimeException("error");
                }
                finally{
                                if(fr!=null)
                        try{                              
                                fr.close();
                        }catch(IOException e){}
                        if(fw!=null)
                        try{
                                fw.close();
                        }catch(IOException e){}
                }      
        }
}[/code]
作者: 匿名    时间: 2011-9-3 23:28
throws IOException 的作用是将可能出现的异常抛给调用这个方法的方法,main方法上加throws IOException意思就是把异常交给jvm处理了
作者: 李叶    时间: 2011-9-4 01:59
这个问题嘛,首先要弄清楚报错信息的含义

先来看你程序运行时候报错的第一句:
Exception in thread "main" java.lang.NullPointerException
这句话是什么意思呢,这句话的意思就是:
在你执行main方法的时候,程序抛出了一个异常,异常的名字叫做NullPointerException

至于“异常”的定义和概念,如果你没有学过的话
你就简单地把它理解成用于描述错误细节的信息就好了
所以,Exception in thread "main" java.lang.NullPointerException这句话你就可以理解成:
你的程序出现了错误,错误的描述信息是NullPointerException

下面我们就来看一看NullPointerException描述的是什么错误吧
NullPointerException,翻译成中文就应当是“空指针异常”
而这种错误如果产生的话,通常只有一个原因,那就是:
当一个变量的值为null的时候,你如果调用了这个变量的属性或方法
由于null是没有任何属性或者方法的,所以就会出现NullPointerException错误

了解了NullPointerException的含义之后,我们再来看看错误信息中下面的一句话
at L.main(L.java:16);
这句话的含义应该很好理解吧?照直翻译过来,就是:
在L.java这个类的第16行出了错,这行代码是main方法中的代码

所以,我们就把注意力集中在第16行代码上[code=java]while((len=fr.read(buf))!=-1)[/code]在这行代码中,我们可以看到调用了fr这个变量的read()方法去读取数据
那么,如果fr这个变量的值为null的话,程序就会出现NullPointerException错误
所以,问题的关键就变成了:fr这个变量的值究竟是不是null呢?

我们现在再往回看一段代码吧,我们可以发现在第8行的代码是这样写的:[code=java]FileReader fr=null;[/code]在这行代码中,我们可以很清楚地看到fr的值被定义为了null
并且从这行代码开始,直到执行第16行代码之前,fr的值都没有再改变过

所以,问题的原因就出在这里:
当fr的值为null的时候,你就调用了fr中的read()方法

Tips:
在这里我只是指出问题的原因所在,具体这个问题要怎么解决还是你自己来吧呵呵
还有在上面的表述中,我使用的说法是“错误”而不是“异常”,这样说主要是为了方便进行理解
虽然不够严谨,不过也是没有错的~

还有,再啰嗦一句关于学习的一点捷径吧~
每次在解决问题之后,如果你能够把产生这种问题的原因记录下来的话
那么下次一旦再遇上这种问题,就可以很轻松地找到问题所在并且解决它了
日积月累的话,以后你无论遇上什么样的问题,都可以很轻松地找到问题所在并解决它了

[ 本帖最后由 李叶 于 2011-09-04  02:05 编辑 ]
作者: 匿名    时间: 2011-9-4 09:36
。。。。我是来看楼上的
作者: 黑马李刚    时间: 2011-9-4 10:56
谢谢各位先,看来老罗今天心情不错哦
[ 本帖最后由 黑马李刚 于 2011-09-04  10:57 编辑 ]
作者: 匿名    时间: 2011-9-4 11:06
我也是来看李叶同学评论的




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