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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© FirstBlood 中级黑马   /  2015-8-9 21:41  /  429 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.io.*;
class  bufCopy
{
        public static void main(String[] args)
        {
                copy();
        }
        public static void copy()
        {
                BufferedReader bufr = null;
                BufferedWriter bufw = null;
                try
                {
                        bufr = new BufferedReader(new FileReader("FileWriterDemo.java"));
                        bufw = new BufferedWriter(new FileWriter("zzz.txt"));

                        //String line = null;
                        while (bufr.readLine()!=null)  //
                        {
                                bufw.write(bufr.readLine());
                                bufw.newLine();     //换行的方法
                                bufw.flush();
                        }
                }
                catch (IOException e)
                {
                        throw new RuntimeException("读写失败");
                }
                finally
                {
                        try
                        {
                                if(bufr!=null)
                                        bufr.close();
                        }
                        catch (IOException e)
                        {
                                throw new RuntimeException("读取关闭失败");
                        }
                        try
                        {
                                if(bufw!=null)
                                        bufw.close();
                        }
                        catch (IOException e)
                        {
                                throw new RuntimeException("写入关闭失败");
                        }
                }
        }
}

大家看一看,红色部分为什么写成这个样子会出现异常:(Exception in thread "main" java.lang.NullPointerException)?为什么一定要写成如下形式的:
                        String line = null;
                        while ((line = bufr.readLine())!=null)  //
                        {
                                bufw.write(line);
                                bufw.newLine();     //换行的方法
                                bufw.flush();
                        }

谢谢解答!

13 个回复

倒序浏览
就是你觉得返回给了String是多余,那么burf.readline();返回的是String类型的字符串,你可以把它看成是一口水,String出来的对象是装水的杯子,!= null判断不是空,
如果按照报错的写法就是在判断,这一口水是不是空的?
如果按照修改的写法就是在判断,这个杯子是不是空的?  
你觉得哪个更恰当些
回复 使用道具 举报
burf.readline()
一次循环执行了2次readline,所以会有数据被跳过

假设读入的数据只有2行,那么while()中执行一次,,那么
循环体中的的readline就是第二行的数据,就是说你永远拿不到奇数行,空指针就是说你循环体中读取了最后一行+1的数据。这个是不存在。
回复 使用道具 举报
while (bufr.readLine()!=null)  //
                        {
                                bufw.write(bufr.readLine());
}

你这样子做的话,相当于一次循环,走了两行,而只把第二行的数据读到了目标文件夹"zzz.txt"中。
而循环中的 bufw.write(bufr.readLine());中的bufr.readLine()这一句并没有检测是否为空。所以出错了。

不知道你有没有看集合中的list的iterator遍历,也是同样的问题。next()函数要慎用,因为它会指向下一行。
回复 使用道具 举报 1 0
如果你不定义一个值去接收他的话,那这个值读到哪里去了呢?其实并没有读到bufr.readLine()这个方法里。这个方法只是负责把数据读出来。至于其他楼上已经做出来很详细的回答。

如果您觉得我的回答还满意的话,请回复一下我
我的QQ:2355928351
如果您还有其他的入学前问题可以加我的QQ
回复 使用道具 举报
树懒 发表于 2015-8-10 15:04
while (bufr.readLine()!=null)  //
                        {
                                bufw.wr ...

谢谢你的解答,我明白问题出在哪里了!{:2_36:}
回复 使用道具 举报
耀阳圣尊 发表于 2015-8-10 15:31
如果你不定义一个值去接收他的话,那这个值读到哪里去了呢?其实并没有读到bufr.readLine()这个方法里。这 ...

谢谢你的回答!
回复 使用道具 举报
孙晓磊 发表于 2015-8-10 14:42
就是你觉得返回给了String是多余,那么burf.readline();返回的是String类型的字符串,你可以把它看成是一 ...

谢谢您的回答!学习了!
回复 使用道具 举报
keviner 发表于 2015-8-10 14:53
burf.readline()
一次循环执行了2次readline,所以会有数据被跳过

谢谢你的回答,现在更清晰了。
回复 使用道具 举报
空指针异常!try里面的语句不一定会全部执行到,所以两个流都有可能会是null,null是不能调方法的,所以要添加!=null
回复 使用道具 举报
一次循环走了两遍,肯定报错了
回复 使用道具 举报
q985274961 来自手机 中级黑马 2015-8-14 07:23:03
12#
看不懂额
回复 使用道具 举报
readLine()
                throws IOException
读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后 直接跟着换行。(这是API文档里对readLine方法的描述,楼楼的那种写法的话,先用了一次readLine去读取判断,然后又用readLine读取再写入,第一次用readLine只是去判断并没有写入,而是直接写了第二次读写那行)
回复 使用道具 举报
  //String line = null;
                        while (bufr.readLine()!=null)  //
                        {
                                bufw.write(bufr.readLine());
                                bufw.newLine();     //换行的方法
                                bufw.flush();
                        }

这段是这样的判断里面执行了一次读取一行,下面 bufw.write(bufr.readLine());又执行了一次,当判断里面的读取到/n换行符之后,下面的 bufw.write(bufr.readLine());读取为空的所以出错
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马