黑马程序员技术交流社区

标题: 一个我自定义lineReader()方法中的问题 [打印本页]

作者: 黑马任雪刚    时间: 2012-5-19 17:28
标题: 一个我自定义lineReader()方法中的问题
import java.io.*;
class Myl
{
        private FileReader f;
        Myl(FileReader f)
        {
                this.f=f;
        }
        public String myReadLine() throws IOException
        {
                StringBuilder sb=new StringBuilder();
                int ch=0;
                while((ch=f.read())!=-1)
                {
                        if(ch=='\r')
                                continue;
                        if(ch=='\n')
                                return sb.toString();
                        else
                                sb.append((char)ch);
                }
                if(sb.length()!=0)
                {
                        return sb.toString();
                }
                return null;//为什么这儿要返回一个null呀???????
        }
        public void myClose() throws IOException
        {
                f.close();
        }
}
public class Mylnr
{

       
        public static void main(String[] args) throws IOException
        {
                Myl m=new Myl(new FileReader("demo.txt"));
                String line=null;
                while((line=m.myReadLine())!=null)
                {
                        System.out.println(line);
                }
                m.myClose();

        }

}

作者: 8161776    时间: 2012-5-19 17:41
本帖最后由 杨尧 于 2012-5-19 18:18 编辑

return null;//为什么这儿要返回一个null呀???????
因为你这个方法声明了返回类型,不是void,那么你这个方法就必须返回一个值,不然会报错的,
而且最后也不需要返回一个实际的值,所以就返回null


作者: 任睦强    时间: 2012-5-19 17:52
return null;//为什么这儿要返回一个null呀???????
因为你读的这个文件或许没有内容,就不走while循环,
StringBuilder对象里面就没有值,这样就返回一个空,就表示文件里面没有内容
作者: 李文富    时间: 2012-5-19 18:00
import java.io.*;
class Myl
{
        private FileReader f;
        Myl(FileReader f)
        {
                this.f=f;
        }
        public String myReadLine() throws IOException
        {
                StringBuilder sb=new StringBuilder();
                int ch=0;
                while((ch=f.read())!=-1)
                {
                        if(ch=='\r')
                                continue;
                        if(ch=='\n')
                                return sb.toString();
                        else
                                sb.append((char)ch);
                }
                if(sb.length()!=0)
                {
                        return sb.toString();
                }
                return null;//为什么这儿要返回一个null呀???????
                                //请看42行的while循环判断条件,你调用后返回null了
                                //就跳出循环;

        }
        public void myClose() throws IOException
        {
                f.close();
        }
}
public class Mylnr
{
        
        public static void main(String[] args) throws IOException
        {
                Myl m=new Myl(new FileReader("demo.txt"));
                String line=null;
                while((line=m.myReadLine())!=null)
                {
                        System.out.println(line);
                }
                m.myClose();
        }
}

作者: 李保成    时间: 2012-5-19 20:17

首先要明确StringBuilder底层是一个数组结构。

StringBuilder sb=new StringBuilder();  //创建一个字符串,用于接收数据传入的数据
int ch=0;                              //用于接收读取返回的数据
while((ch=f.read())!=-1)               //循环条件,如果返回的字节不为-1,则表示还有数据,继续读   
{
        if(ch=='\r')
                continue;
        if(ch=='\n')
                return sb.toString(); //这两行是读取标记,看是否是读取了一行,如果是一行的话,则将存入数组的字节变为字符串返回
        else
                sb.append((char)ch);
}
if(sb.length()!=0)  //结合while循环,如果while循环结束,且字符串长度不为空,则将已存在到数组中的字节转化为字符串返回
{
        return sb.toString();
}
return null;//为什么这儿要返回一个null呀???????至于这儿为什么返回的是return null,为了程序的严谨性,如果上边的条件都没有满足,也好有个返回值




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