代码如下:
for (int i=0;i<8;i++)
  for(int j=0;j<8;j++)
  {
     char c=' ';
     System.out.println("INPUT:");
     try{
        c=(char)System.in.read();
      }catch(IOException e){}
     if(c=='1')
     {
       System.out.print(OK!);
      }
      else 
        j--;
   }编译运行时,第一次出现一次INPUT,输入一个字符后出现三个INPUT,为什么?

解决方案 »

  1.   

    我来分析一下
    public static void main(String[] args) {
           for (int i=0;i <8;i++) 
               for(int j=0;j <8;j++) 
                   { 
      char c= ' '; 
              System.out.println("INPUT:"); a
              try{ 
           c=(char)System.in.read(); b
         }catch(IOException e){} 
      if(c== '1') 
                 { 
           System.out.print("OK!"); c
         }else  
       j--; //感觉这个地方是写错了吧
            }
    }函数执行到a时,首先输出了INPUT,然后接受键盘输入,接下来的处理过程是:
        1.假设我们输入的字符是 2,肯定还有一个enter;实际上是两个键,程序运行如下:
           1.1  读入'2',此时输出一个 INPUT ;
          1.2  读入enter,此时输出一个 INPUT;
           1.3  执行循环到b处,等待输入,此过程又输出一个 INPUT;
           程序结果是三个 INPUT
        2.假设我们输入的字符是 1,也要有enter;仍旧是两个键,程序运行如下:
           2.1  读入'1',此时输出一个 INPUT ;
          2.2  判定是'1',输出一个 OK!;
          2.3  读入enter,此时输出一个 INPUT;
           2.4  执行循环到b处,等待输入,此过程又输出一个 INPUT;
           程序结果是三个 OK! INPUT: INPUT: INPUT:
         3.假设输入enter;是一个键,程序运行如下:
           3.1  读入enter,此时输出一个 INPUT;
           3.2  执行循环到b处,等待输入,此过程输出一个 INPUT;
           程序结果是 INPUT: INPUT:     lz不清楚问题的所在就是对IO上概念不够清晰,我也遇到过类似的问题,希望能对你有所帮助。
         ps:我是菜鸟,共同学习
      

  2.   

    没有理解:以输入enter为例。
    1、运行程序显示一个INPUT,等待输入。现在程序到b点了。
    2、案回车键,接收一个按键“回车”(回车的ASCII码是13)。
    3、程序到a点时输出INPUT.
    4、程序到b点等待输入。
    这样我的理论输出结果是:
    INPUT:INPUT:
    实际运行结果是:
    INPUT:INPUT:
    INPUT:
    为什么?
      

  3.   

    嗯,这个我想可能是下面这个原因吧
    public abstract int read()
           throws IOException从输入流读取下一个数据字节。返回 0 到 255 范围内的 int 字节值。
            
            1.如果因已到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流的末尾或者抛出异常前,此方法一直阻塞。 
      

  4.   

    不好意思,不是这个问题
    在我们按下Enter的时候,实际上发送的两个键值:一个回车(13),一个是换行(10);
    所以在执行的时候就会有两个输出水平不高,记得不牢,不好意思啊,呵呵
      

  5.   

    结果:
    INPUT:
    1
    OK!INPUT: -------A
    INPUT:    -------B
    INPUT:    -------C输入1,成功读到1,所以打印出OK
    AInput读到的是\r,所以继续循环
    BInput读到的是\n,继续循环
    CInput停止不动,等待键盘输入。
    这个程序没什么意思呀。
      

  6.   

    结果:
    INPUT:
    1
    OK!INPUT: -------A
    INPUT:    -------B
    INPUT:    -------C输入1,成功读到1,所以打印出OK
    AInput读到的是\r,所以继续循环
    BInput读到的是\n,继续循环
    CInput停止不动,等待键盘输入。
    这个程序没什么意思呀。
      

  7.   

    这段代码是没有什么意义!
    不过可以更好的了解System.in.read()。也许以后作项目时能用上,知识是一点点积累地。
      

  8.   

    先谢谢大家了。
    我解释一下:我是想写一段代码来输入一定量特定的(如0,1,2)的字符,所以有  "esle j--;"
    看到你们讲的后,
    把代码改成:
             String c="";
            BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
            for(int i=0;i<8;i++)
                for(int j=0;j<8;j++)
                {
                     System.out.println("INPUT");
                     c=in.readLine();
                     if(c=="1")
                     {
                           System.out.println("OK!");
                     }
                     else
                           j--;
                }
    编译运行时,却没有"OK!"了。现在还没找到原因。
    改成如下:
             String c="";
            BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
            for(int i=0;i<8;i++)
                for(int j=0;j<8;j++)
                {
                     System.out.println("INPUT");
                     c=in.readLine();
                    System.out.println("i="+i+"/tj="+j);
                     if(c=="1")
                     {
                           System.out.println("OK!");
                     }
                     else
                           j--;
                }
    来测试i和j的值,发现两者都为0,没有变。
    为什么?
    附:
    在windows下按下ENTER键,有两个值(/r/n),在unix/linux下只有一个值(/n);
    没记错的话是那样的,不信把%JAVA_HOME%/jdk1.5.0_04/下的scr.zip解压缩,
    用记事本打开任一个java文件,会发现有很多的小黑方块。
      

  9.   

    写错了,是"\r\n"和"\n".
    不好意思,新手。
      

  10.   

    呵呵,不客气,大家共同学习嘛对你的这两个问题:
    第一个问题的要点在于:对于字符串的比较不要用'=='操作符,而要用equals(),方法,代码如下:
             String c=""; 
            BufferedReader in=new BufferedReader(new InputStreamReader(System.in)); 
            for(int i=0;i <8;i++) 
                for(int j=0;j <8;j++) 
                { 
                     System.out.println("INPUT"); 
                     try {
    c=in.readLine();
                         } catch (IOException e) {
    e.printStackTrace();
    }
                     if(c.equals("1"))
                     { 
                           System.out.println("OK!"); 
                     } 
                     else 
                      System.out.println("after");
                           j--; 
                } 
    至于第二个问题的要点在于,循环语句的执行顺序,按照你的写法,程序的内部循环执行如下:
         首先,j--; 然后在循环控制语句中进行 j++ ;结果就是 j == j == 初始值 0 ,这是个死循环,永远不会结束
         
      

  11.   

    for (int i=0;i <8;i++) 
      for(int j=0;j <8;j++) 
      { 
         char c= '  '; 
         System.out.println("INPUT:"); 
         try{ 
            c=(char)System.in.read();      //A
          }catch(IOException e){} 
         if(c== '1 ') 
         { 
           System.out.print(OK!); 
          } 
          else  
            j--; 
       } 
    第一次程序执行到A处时 输入一个字符并按下回车键。
    分析这次输入,真正输入输入流的数据是字符和代表回车键的两个字符。
    当下一次程序执行到A处时,输入流中仍然有数据,故赋给C,显示在控制台上是空格(代表回车键的第一个自符)。
    程序继续执行下一循环,输入流中仍然有数据,故赋给C,显示在控制台上是空格(代表回车键的第二个自符)。
    程序继续执行下一循环,此时输入流中无字符,故等待输入,所以第一次出现一次INPUT,输入一个字符后出现三个INPUT。
      

  12.   

    呵呵,我用equals()方法,搞定了,还有那个j--的问题,我那样写是正确的。
    正在完成一个离散数学的作业,判断一个集合中元素之间的二元关系。
    全部代码如下:
    import java.io.*;public class work 
    {
        private byte [][]A;  //定义一个数组来保存集合A中的关系
        private int number;  //集合A中元素的个数

        private static final int NO=0;  //没有关系
        private static final int ZI_FAN=1;  //自反性
        private static final int FAN_ZI_FAN=2;  //反自反性
        private static final int DUI_CHEN=3;  //对称性
        private static final int FAN_DUI_CHEN=4;  //反对称性
        private static final int CHUAN_DI=5;  //传递性    public work() throws IOException  //work的构造方法,在此要求一个一个地输入关系
       {
            BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));//字符串缓冲区
            String str; //存放输入的字符串
            int n; //存放输入的数字
            System.out.print("请输入A中元素的个数:");
            str=reader.readLine(); //输入数字的字符串
            try
            {
                n=Integer.parseInt(str);//将字符串转化为数字
            }
            catch(NumberFormatException e)  //字符串输入不是数字时,n默认是3
            {
                n=3;
            }
            if(n<=0) //当输入的数字是非正数时,n默认是3
                n=3;

            number=n;
            A=new byte[number][number];

            System.out.println("A中共有"+number+"个元素.");   //由于可能出现上面出现的错误,提醒一下A中元素的个数

            for(int i=0;i<number;i++)
                for(int j=0;j<number;j++)
               {
                     System.out.print("第"+(i+1)+"个元素和第"+(j+1)+"个元素的关系[0-无,1-有]:");
                     str=reader.readLine();
                     if(str.equals("0"))
                               A[i][j]=0;
                     else if(str.equals("1")
                               A[i][j]=1;
                     else j--; //当输入的不是0,1时,j减少1。这样,下一个循环时j不变
               }
        }

        public int ifZiFan() //判断自反性
        {
             int sign=0; //存放性质
             int i; //循环个数

             if(A[0][0]==0)
                  sign=FAN_ZI_FAN; //当第一个元素与第一个元素没有关系时,是反自反的
             else if(A[0][0]==1) 
                  sign=ZI_FAN; //同理,自反的

             for(i=1;i<number;i++)
             {
                  if(A[i][i]!=A[0][0])
                       break; //当一下斜行中有不同的关系时跳出循环
             }
             if(i<number)
                    return NO; //没有自反性或反自反性
             else return sign; //只有完全执行完循环,才有反自反性或自反性
        }    public int ifDuiChen() //判断对称性
        {
             int i,j;
             int duiChen=0,fanDuiChen=0; //记录对称与反对称的个数
             for(i=0;i<number;i++)
                 for(j=0;j<number;j++)
                 {
                       if((A[i][j]==1)&&(A[j][i]==1))
                               duiChen++; //当第i个元素与第j个元素有关系且第j个元素与第i个元素有关系时
                       else if((A[i][j]==1)&&(A[j][i]==0))
                               fanDuiChen++; //当第i个元素与第j个元素与第j个元素与第i个元素不同时有关系时
                  }
             if(duiChen>0&&fanDuiChen>0)
                   return NO;
             else if(duiChen>0&&fanDuiChen==0)
                   return DUI_CHEN;
             else return FAN_DUI_CHEN;
        }

        public int ifChuanDi() //判断传递性,这个方法还有问题,不能正确的判断,修改中... ...
        {
              for(int i=0;i<number;i++)
              {
                     for(int j=0;j<number;j++)
                     {
                          if(j==i)
                               continue;
                           else if(A[i][j]==1)
                                for(int k=0;k<number;k++)
                                {
                                     if(k==j)
                                           continue;
                                     else if(A[j][k]==1)
                                           if(A[i][k]!=1)
                                                  return NO;
                                 }
                      }
              }
              return CHUAN_DI;
         }

         public void display()
        {
              for(int i=0;i<number;i++)
              {
                     for(int j=0;j<number;j++)
                     {
                           System.out.print(A[i][j]);
                      }
                      System.out.println("");
              }
         }

         public static void main(String[] args) throws IOException
         {
               work a=new work();
               a.display();
               int sign=0;

               sign=a.ifChuanDi();
               if(sign==NO)
                      System.out.println("A没有传递性.");
               else if(sign==CHUAN_DI) 
                      System.out.println("A有传递性.");

               sign=a.ifDuiChen();
               if(sign==NO)
                      System.out.println("A既不对称也不反对称.");
               else if(sign==DUI_CHEN)
                      System.out.println("A有对称性.");
               else if(sign==FAN_DUI_CHEN)
                      System.out.println("A有反对称性.");

               sign=a.ifZiFan();
               if(sign==NO)
                      System.out.println("A既不自反也不反自反.");
               else if(sign==ZI_FAN)
                      System.out.println("A有自反性.");
               else if(sign==FAN_ZI_FAN)
                      System.out.println("A有反自反性.");
         }
    }
      

  13.   

    改后判断传递性的方法:
      public int ifChuanDi() 
      //判断传递性,先检测两个元素间是否有关系,若有则检测第二个元素和非第一个元素(第三个元素)是否有关系,
      //若有则判断第一个元素和第三个元素是否有关系,如果没有则没有传递性,返回NO
      {
          for(int i=0;i<number;i++)
            for(int j=0;j<number;j++)
            {
                if(A[i][j]==1)
                    for(int k=0;k<number;k++)
                    {
                        if(k==i)
                           continue;
                       if(A[j][k]==1)
                            if(A[i][k]==0)
                                 return NO;
                    }
            }
          return CHUAN_DI;
      }这样应该OK了。