如何防止错误消息在 Java 中重复出现?

How do I prevent an error message from repeating in Java?

我正在尝试编写一个程序来计算阶乘,但我无法弄清楚为什么如果我输入字母而不是整数,错误消息会显示两次。
我觉得这个问题与 第 29 行 c = sc.next().charAt(0); 有关,但我不确定如何解决它。感谢任何帮助。

我的程序:

public class Factorials {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        char c = 'Y';
        int num = 0;

        do
         {
            System.out.print("Enter a number to calculate its factorial: ");
            while (!sc.hasNextInt()) { 
                System.out.println("Invalid Entry - Enter only Integers! Try Again: ");
                sc.nextLine();
            }
            
            int result = 1;
            num = sc.nextInt();
            for(int i = 1; i <= num; i++) {
                result = result * i;
            }
            System.out.println("The factorial of " + num + " is: " + result);
            
            System.out.println("Do you wish to continue? Y/N: ");
            
            c = sc.next().charAt(0);
        }while(c == 'y' || c == 'Y');
        sc.close();
    }       
}

简单修复:将代码中的 sc.nextLine(); 更改为 sc.next(),您应该可以开始了。发生此错误是因为 .nextLine() 将 enter/return 键视为一个单独的字符,而 .next() 则不会。 (输入 'y' 或 'n' 后按下回车键:如果您尝试,如果您第一次输入字母 运行,错误消息不会打印两次程序)。

旁注:您可能希望它是 .print(/*invalid input sentence*/) 而不是 .println() 以配合您接收其他数值的方式。

否则,你很好!

c = sc.next().charAt(0);

之后添加sc.nextLine();

Finds and returns the next complete token from this scanner. A complete token is preceded and followed by input that matches the delimiter pattern

如 jdk 文档所示,'sc.next' 方法将在到达 space 时 return,输入或 return。所以当你回车输入'y'时,回车符还在buffer中。您可以将 sc.nextLine 分配给变量,例如

String str = sc.nextLine();
System.out.println(str);

您可以看到输入字符和您输入的字符。

@TheSj 和@Lahiru Danushka 的回答都可以解决这个问题。