为什么下面的代码在循环内的 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' 时,您就这样做了。
以下是使用堆栈反转单词的程序。 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' 时,您就这样做了。