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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈迎春 中级黑马   /  2013-3-26 09:40  /  2832 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈迎春 于 2013-3-26 09:43 编辑

代码如下:
  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. public class ReadKey {
  4.         public static void main(String[] args) throws IOException {

  5.                 readKey2();               
  6.         }

  7.         public static void readKey2() throws IOException {
  8.                
  9.                 /*
  10.                  * 获取用户键盘录入的数据,
  11.                  * 并将数据变成大写显示在控制台上,
  12.                  * 如果用户输入的是over,结束键盘录入。
  13.                  *
  14.                  * 思路:
  15.                  * 1,因为键盘录入只读取一个字节,要判断是否是over,需要将读取到的字节拼成字符串。
  16.                  * 2,那就需要一个容器。StringBuilder.
  17.                  * 3,在用户回车之前将录入的数据变成字符串判断即可。
  18.                  *
  19.                  */
  20.                
  21.                 //1,创建容器。
  22.                 StringBuilder sb = new StringBuilder();
  23.                
  24.                 //2,获取键盘读取流。               
  25.                 InputStream in = System.in;
  26.                
  27.                 //3,定义变量记录读取到的字节,并循环获取。                 
  28.                 int ch = 0;      //我的问题是:我这样改下为什么不对了。int ch = in.read();  while(ch!=-1){..........}
  29.       
  30.                 while((ch=in.read())!=-1){
  31.                         
  32. //                        在存储之前需要判断是否是换行标记 ,因为换行标记不存储。
  33.                         if(ch=='\r')
  34.                                 continue;
  35.                         if(ch=='\n'){
  36.                                 String temp = sb.toString();
  37.                                 if("over".equals(temp))
  38.                                         break;
  39.                                 System.out.println(temp.toUpperCase());
  40.                                 sb.delete(0, sb.length());
  41.                         }
  42.                         else
  43.                         //将读取到的字节存储到StringBuilder中。
  44.                         sb.append((char)ch);
  45.                         
  46. //                        System.out.println(ch);
  47.                 }
  48.                
  49.         }
复制代码
我的问题在第30行,请大神帮忙解答下,在线等,谢谢了

点评

如果你的问题已经得到解决,请及时将主题改为[已解决],如果还有问题请继续追问,谢谢!  发表于 2013-3-27 11:09

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

8 个回复

倒序浏览
int ch = 0;      //我的问题是:我这样改下为什么不对了。int ch = in.read();  while(ch!=-1){..........}
in.read() 这样只能读一个字节,你在循环里要么死循环,要么不执行 你在把错误贴出来 我看看,你问的问题有些模糊
把错误提示贴出来

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
像你那样改的话,就是死循环.while里没有结束条件,因为一直读不到-1.
你应该把读的动作in.read()放在while的条件判断里.

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
把 int ch = in.read(); 定义在外面相当于把键盘录入的第一个字符赋给ch 然后ch进入while循环始终保持这个值不变,如果开始ch满足不等于-1,循环就永远无法结束。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
int ch = 0;      //我的问题是:我这样改下为什么不对了。int ch = in.read();  while(ch!=-1){..........}你的这个问题明显是死循环;

int ch = in.read();  读取的是第一个字节,ch不为-1的话,while(ch!=-1){..........}永远都不能停止下来。ch=-1的话,循环就不会执行;

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
int ch = 0;      //我的问题是:我这样改下为什么不对了。int ch = in.read();  while(ch!=-1){..........}你的这个问题明显是死循环;
int ch=in.read(),ch的值为不文件的第一个字节,假如第一个字节为30,那么决断时就会出现while(30! =-1),30!=-1为true,也就是说这个while语句下的内容会被一直重复。你可以通过在while语句上打印ch的值来看出。
如果在while语句中这样写while((ch=in.read)!=-1),第一次读取ch时,是第一个字节的值,执行一次while循环中语句,然后再回来判定循环条件,此时in.read()方法读取的就是下一个字节。
回复 使用道具 举报
我手心里的宝 发表于 2013-3-26 10:03
int ch = 0;      //我的问题是:我这样改下为什么不对了。int ch = in.read();  while(ch!=-1){......... ...

谢谢哈,我懂了呢、、、、
回复 使用道具 举报
谢谢你们哈,我懂了那、、、
回复 使用道具 举报
我的贴子怎么改成已解决呀?谢谢啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马