为什么终端不会提示此JAVA代码的其他输入?

时间:2018-06-17 07:58:55

标签: java

C:\Users\{MyName}\node_modules\

我正在使用命令行来运行这个java程序,我希望用户能够连续输入一些东西,而不是每次他们错误地猜错时都必须手动运行程序。尝试了很多方法,但第二个class test { public static void main(String args[]) throws java.io.IOException { char ch, answer = 'K'; System.out.println("I'm thinking of a letter between A and Z."); System.out.print("Can you guess it: "); ch = (char) System.in.read(); if(ch == answer) { System.out.println(" *** YOU ARE RIGHT *** "); else System.out.println("Please try again: "); ch = (char) System.in.read(); } } } 没有显示提示,而代码只是在终端必须再次手动运行程序才能播放。我是初学者,所以我很难理解。

3 个答案:

答案 0 :(得分:0)

这将有效:

import java.util.Scanner;
class test {
    public static void main(String args[]) throws java.io.IOException {
            char ch, answer = 'K';
            Scanner s = new Scanner(System.in);
            System.out.println("I'm thinking of a letter between A and Z.");
            System.out.print("Can you guess it: ");
            ch = s.next().charAt(0);
            if(ch == answer){
                    System.out.println(" *** YOU ARE RIGHT *** ");
            } else{
                    System.out.println("Please try again: ");
                    ch = s.next().charAt(0);
            }
    }
}

答案 1 :(得分:0)

正如@GhostCat所提到的那样,你应该在if和else的情况下加上括号,否则无论if语句如何都会发生第二次读取

if (ch == answer) {
    // your if code here
else {
    // your else code here
}

其次,如果你想让它无限期地运行直到他们给出正确的答案,你需要某种循环。在这种情况下,您可能需要一个while循环。这将取代if语句

while (ch != answer) {
    // ask for retry
}
// They were right!

结束括号后的代码只会在while循环的条件为false时运行(在这种情况下,当ch等于answer时)。意思是,此时您可以处理正确的答案。同时,如果他们输入了错误的答案,程序将循环,系统将提示他们再次尝试。

编辑:至于为什么原始代码没有等待第二个输入而只是停止,在命令行中输入第一个字符实际上会在输入结尾添加一个额外的回车/换行符,所以第二个read立即消耗这个新的行字符并继续(在初始代码中没有别的事可做,所以它退出)。

答案 2 :(得分:0)

if(ch == answer) 
     System.out.println(" *** YOU ARE RIGHT *** ");

       else System.out.println("Please try again: ");
        ch = (char) System.in.read();        

相当于

if(ch == answer) {}
    System.out.println(" *** YOU ARE RIGHT *** ");
} else {
    System.out.println("Please try again: ");
}
ch = (char) System.in.read(); 

缩进在语义上或语法上都没有效果。这只是一个惯例,但它对你的程序没有影响(与python相反)。

你应该循环程序:

while(ch != answer) {
    ch = (char) System.in.read();
    ....
}

然而,这缺乏EOF处理。最好使用这样的东西:

while(true) {
   int ch = System.in.read();
   if(ch < 0) {
      System.out.println("Bye!");
   }

   if((char)ch == answer) {
      System.out.println("YOU ARE RIGHT");
      break;
   }

   System.out.println("Please try again: ");
}

另外,请记住read()只读取一个字节,这取决于您输入数据的方式可能会令人困惑,因为终端通常会缓冲输入,直到您按Enter键...并非所有终端都执行此操作但大多数都这样做。使用提供System.console方法的readLine可能会更好。但是,如果没有控制台连接到stdin,System.console将不起作用(例如将输入连接到stdin时,但对于你的情况来说这不是问题,因为我认为你的程序不打算通过管道使用)。您可以使用System.console.readLine(),然后使用trim String方法删除不需要的字符。