黑马程序员技术交流社区

标题: return不是起结束函数的作用么? [打印本页]

作者: 尘埃落定    时间: 2014-8-7 17:23
标题: return不是起结束函数的作用么?
  1. class MyBufferedReader{  
  2.     private FileReader fr;  
  3.     MyBufferedReader(FileReader fr){  
  4.         this.fr = fr;  
  5.     }  
  6.     //可以一次读一行数据的方法  
  7.     public String myReadLine() throws IOException{  
  8.         //定义一个临时容器,原BufferedReader封装的是字符数组  
  9.         //为了方便,定义一个StringBuilder容器,因为最终还是要将数据变成字符串  
  10.         StringBuilder sb = new StringBuilder();  
  11.         int ch = 0;  
  12.         while((ch=fr.read())!=-1){  
  13.             if(ch=='\r')  
  14.                 continue;  
  15.             if(ch=='\n')  
  16.                 return sb.toString();
复制代码



作者: 尘埃落定    时间: 2014-8-7 17:26

作者: ddewym123    时间: 2014-8-7 17:42
假设文本有n行数据,前n-1行数据最后都有换行符,因此方法会通过读取‘\n’,然后返回sb的内容,从而结束方法;但是第n行,也就是最后一行,该行没有换行符,只有文本结束符EOF,它的值为-1。也就是说它在读到-1,从而结束while循环后,sb内的数据并未返回,因此需要通过判断sb的长度是否为0,来决定是否返回sb内数据(有可能文本是空的,没有数据,那么此时sb的长度就为0)。

作者: 尘埃落定    时间: 2014-8-7 22:25
ddewym123 发表于 2014-8-7 17:42
假设文本有n行数据,前n-1行数据最后都有换行符,因此方法会通过读取‘\n’,然后返回sb的内容,从而结束方 ...

你应该理解错我的问题了,我问的是return应该是起结束函数的作用,那下面的if(sb.length()!=0)应该会读不到,不是要加上if(sb.length()!=0)的原因。你回答的应该是为什么要加上最后这个if判断。我的问题是:我知道要加上,可是加上后能读到么?
作者: huangxuanheng    时间: 2014-8-7 22:45
return就是结束标志啊,楼主你还没有理解好你的代码,首先还没有符合这个ch=='\n'条件时,就会跳到else语句中,完成了else语句中的sb.append((char)ch);后,就会开始运行下一个if语句.......
作者: 贾浩田    时间: 2014-8-7 22:47
你写的这个应该是自定义readLine(),最后的循环外判断只有在数据最后一行没有'\n'的情况下才进入,前n-1行由于都已'\n'所以直接返回s.toString了,最后一行如果没有'\n',那么append以后数据没有返回,所以程序会顺下执行而去执行你担心的部分,最后的 return sb.toString();  
作者: ddewym123    时间: 2014-8-8 08:10
尘埃落定 发表于 2014-8-7 22:25
你应该理解错我的问题了,我问的是return应该是起结束函数的作用,那下面的if(sb.length()!=0)应该会读不 ...

我觉得是你没理解我的意思。只有前n-1行,方法才会从while 循环里面的return语句出去;而第n行,方法会从while循环外的那两个return语句出去,至于哪个根据sb,length()判断。




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