为什么下面的代码在循环内的 try 块中显示了两次语句?

Why is the following code showing twice the statements inside try block inside the loop?

以下是使用堆栈反转单词的程序。 stack的实现没有问题。它执行得很好。当按下 ctrl-c 时,它会打印 try-catch 块的内容两次甚至三次。这是什么原因造成的?

import java.util.NoSuchElementException;
import java.util.Scanner;
class WordReversal {
    public static void main(String args[]) {
    StackIFace sfWord;  // interface reference
    Stack s = new Stack();
    sfWord = s;
    Scanner sc = new Scanner(System.in);
    System.out.println("Control-C to stop.");
    for(;;) {
        String senWord = "", revWord = "";
        try {
                System.out.println("Enter a word: ");
                senWord = sc.next();
                for(int i=0;i<senWord.length();i++)
                sfWord.push(senWord.charAt(i));
                for(int i=0;i<senWord.length();i++)
                    revWord+=sfWord.pop();
                System.out.println("Original Word::"+senWord+"\nReversed Word::"+revWord);
            } catch(NoSuchElementException NSEe) {
            System.out.println("Control-C command accepted.\nQuitting...");
            //break;
            }
        }
    }
}

这里要注意的一件事是,如果我输入 break(只需删除上面代码中的两个正斜杠),问题就解决了,但究竟是什么原因造成的?这是 Scanner 造成的还是语言问题?

您正在使用无限循环,但没有告诉它何时停止。 添加 break 语句终止 for 循环。因此,它正在工作。

NoSuchElementException 实际上并不是“拦截 ctrl/C”。所以可能发生的情况是你正在终止输入,next() 调用抛出异常,因为没有输入,你打印一条消息,然后循环再做一次。

输入仍然终止,因此 next() 调用抛出异常....

令我吃惊的不是它循环,而是它在循环2或3次后停止循环。也许会抛出一些您没有捕捉到的其他异常;很难说不添加处理程序来检查。

但根本问题是:如果您希望该特定异常退出程序,您需要编写退出程序的代码。实际上,当您在循环外编写 'break' 时,您就这样做了。