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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余善航 中级黑马   /  2013-2-22 20:09  /  1306 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.io.InputStream;

public class System_Jian {

        /**
         * @param args
         * @throws IOException
         */
       
        public static void main(String[] args) throws IOException {
                // TODO Auto-generated method stub
                InputStream in =System.in;
                StringBuilder sb=new StringBuilder();
                while(true)
                {
                        int c=in.read();
                        if(c=='\r')
                                continue;
                        if(c=='\n')
                        {
                                String s=sb.toString();
                                if("over".equals(s))
                                        in.close();     // 问题 break;
                                System.out.println(s);
                                sb.delete(0,sb.length());
                        }
                        sb.append((char)c);
                }
        }

}
/*
*  用的工具是 Myeclipse 6.5
*  按照视频做的键盘输入的例子
*          标有问题   不论是in.close();还是 break; 都不能终止程序
*          输入 后回车  依然会打印出来
*/

4 个回复

正序浏览
黄鸿达 发表于 2013-2-22 23:01
你的程序如果第一次输入的是over那肯定退出,in.close通过异常退出, break完美退出.

但是如果如果第2次以 ...

22.收听TA 发消息. 电梯直达   楼主
发表于 昨天 20:09 |只看该作者 |倒序浏览 import java.io.InputStream;

public class System_Jian {

        /**
         * @param args
         * @throws IOException
         */
        
        public static void main(String[] args) throws IOException {
                // TODO Auto-generated method stub
                InputStream in =System.in;
                StringBuilder sb=new StringBuilder();
                while(true)
                {
                        int c=in.read();
                        if(c=='\r')
                                continue;
                        if(c=='\n')
                        {
                                String s=sb.toString();
                                if("over".equals(s))
                                        in.close();     // 问题 break;
                                System.out.println(s);
                                sb.delete(0,sb.length());
                        }


                   else //一句话,在这加个else就行了, 不然上次输入的'\n'会保存在sb中, 下次输入over   s 会为"\nover"  所以  if("over".equals(s))为假  in.close();或break;不会执行


                        sb.append((char)c);
                }
        }

}
回复 使用道具 举报
你的程序如果第一次输入的是over那肯定退出,in.close通过异常退出, break完美退出.

但是如果如果第2次以后输入over就退出不了,其实原因是这样的。

比如你第一次输入abcd  
这个时候sb 里面存了“abcd”
sb把"abcd"赋给了s
检测s是否over 结果是false
尽管后面你清除了sb里面的数据

但是if语句结束还是依然会执行sb.append((char)c);语句,也就是因为这个语句把/n这个字符也进去了 。
以至于你无论后面输入什么语句 最前面都有个/n这个,那就肯定不跟OVER一样了

这就证明了为什么第一次输入over就可以 但是第2次以后输入over就退出不了。


和楼上兄弟锁说的加了else,把sb.append((char)c)放else代码块内就可以。
回复 使用道具 举报
in.close()是关闭输入流。怎么会关闭循环呢
回复 使用道具 举报
发现两处问题,
1.导包问题,
你只     import java.io.InputStream;  //运行会报错,找不到符号。IOException
应该      import java.io.*;

2.你只if,没有否则,应该加else
else
{
      sb.append((char)c);  
}

3.关于你这句     in.close();     // 问题 break;
我用in.close()试了下,也可以结束,并且还抱了异常。
等待高手解答
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马