日期:2014-05-20  浏览次数:20760 次

请问这段从键盘输入整数的程序为什么出现死循环呢?
下面是我为了输入整数所编的程序,我不想使用readLine(),于是编写如下,却好像出现了死循环,系统一直等待键盘输入。请问怎么回事?该如何调整呢?谢谢大家!
public   static   void   main(String   abc[])   throws   IOException
{
    int   k;
    char[]   ch=new   char[1];
    StringBuffer   str=new   StringBuffer();
    try{
        System.out.print( "Please   input   an   integer ");
        BufferedReader   bf=new   BufferedReader(new   InputStreamReader(System.in));
        while(bf.read(ch)!=-1){
            str.append(ch);
        }        
        bf.close();
        k=Integer.parseInt(str.toString());
        System.out.print(   k   );        
    }
    catch(NumberFormatException   e){
        System.out.print( "Invalid   input! ");
        return;
    }  

后来我在其他网站上询问,有人回复如下:

“程序从系统输入读取字符。如果输入1,程序得到的是1、换行符和回车符;如果什么也不输入直接回车,那么程序得到换行符和回车符;就是说,永远无法使循环条件   bf.read(ch)!=-1   为   false。

修改部分如下:

            while(bf.read(ch)!=-1){  
                  if(String.valueOf(ch[0]).equalsIgnoreCase( "\n ")){  
                    continue;          
                }                
                if(String.valueOf(ch[0]).equalsIgnoreCase( "\r ")){    
                    continue;          
                }            
                str.append(ch);  
                if(String.valueOf(ch[0]).equals( "9 ")){      
                    break;    
                }    
          }  

输入数字9后,退出并输出前面输入的数字的顺序组合。”
这样倒也行得通。可是系统的输入流总是有限的,当我调用read()方法依次读取流的一个个字符时,它应该总会读到流的结尾,这时候应该返回值-1啊,为什么不会出现呢?谢谢。  



------解决方案--------------------
键盘输入东西,怎么会掉到-1呢?

要知道,程序并不知道你什么时候要停止输入,再给你补一个-1.所以这个-1应该要你自己要做。
------解决方案--------------------
System.in 应该是 BufferedReader 吧,
当其读取文件到最末尾时 便会返回 -1
其它情况 如果没有新的数据流,它会一直线程等待(受线程保护)
建议 你写一个结束输入符 (如 输入 ‘@’表示输入完成)


------解决方案--------------------
ch==-1???
这又不是文件读写