黑马程序员技术交流社区

标题: 由一个小错误引发的关于read阻塞式方法的一些感慨 [打印本页]

作者: Neverbelazy    时间: 2013-5-1 14:40
标题: 由一个小错误引发的关于read阻塞式方法的一些感慨
本帖最后由 Neverbelazy 于 2013-5-1 14:49 编辑

先看一段简化了的代码,需求是读取键盘输入,打印出输入结果,当输入是over时结束
  1. import java.io.*;
  2. public class ReadLineTest {
  3.         public static void main(String[] args) throws Exception{
  4.                 BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));//键盘读取
  5.                 while(true){ //循环读
  6.                         System.out.println(bufr.readLine());
  7.                         if(bufr.readLine().equals("over"))//读到为over
  8.                                 break;//break
  9.                          }
  10.                 }
  11.        }
复制代码
打印结果是,输入打印要再按一次回车(或录入一行)才执行。

错误其实很明显, 可以发现, while中的 readLine()用了两次,由于readLine()是阻塞式的,再判断是否为over时,程序就等在原地,等待再次输入才继续执行。

而导致这样的错误存在的根本原因是代码书写的不够规范,在写程序时,一味的求快而忽略了是否该定义成局部变量?是否该给这个变量一个名字以备后面调用?
所以修改也很简单,而且修改后的代码也看起来更加规范,合理。
  1. import java.io.*;
  2. public class ReadLineTest {
  3.         public static void main(String[] args) throws Exception{
  4.                 BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));//键盘读取
  5.                 String line;
  6.                 while(true){ //循环读
  7.                         line=bufr.readLine();
  8.                         System.out.println(line);
  9.                         if(line.equals("over"))//读到为over
  10.                                 break;//break
  11.                         
  12.                 }
  13.         }
  14. }
复制代码

作者: 暮夕忆夕颜    时间: 2013-5-2 14:26
学习了 楼主真心很给力 我经常图简便  ,今天看到你的这个感慨 真心受教了




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