我有一个非常简单的循环,等待一个数字(int),只要该数字不是exitOption
它不会离开循环,但是我得到一个意外的错误,我不知道是什么导致了它。
修改
添加另一个代码段,以便您可以编译
public static void main(String[] args) throws FileNotFoundException,
SecurityException,
IOException,
ClassNotFoundException {
while (controller.selectOptionMM());
/修改
public boolean selectOptionMM() throws SecurityException,
FileNotFoundException,
IOException {
int cmd = ui.getExitOption();
ui.mainMenu();
cmd = utils.readInteger(">>> "); // this is my problem, right here
// code in next snippet
while (cmd <1 || cmd > ui.getExitOption()) {
System.out.println("Invalid command!");
cmd = utils.readInteger(">>> ");
}
switch (cmd) {
case 1:
case 2:
case 3:
case 4: this.repository.close();
return true;
case 5: return false;
}
return false;
}
以下是失败的原因:
public int readInteger(String cmdPrompt) {
int cmd = 0;
Scanner input = new Scanner(System.in);
System.out.printf(cmdPrompt);
try {
if (input.hasNextInt())
cmd = input.nextInt(); // first time it works
// Second time it does not allow me to input anything
// catches InputMissmatchException, does not print message
// for said catch
// infinitely prints "Invalid command" from previous snippet
} catch (InputMismatchException ime) {
System.out.println("InputMismatchException: " + ime);
} catch (NoSuchElementException nsee) {
System.out.println("NoSuchElementException: " + nsee);
} catch (IllegalStateException ise) {
} finally {
input.close(); // not sure if I should test with if (input != null) THEN close
}
return cmd;
}
第一次我通过低谷,它读取数字没问题。现在,如果数字不是5(在这种情况下是exitOption),它再次通过readInteger(String cmdPrompt)
,除非它跳转到catch (InputMismatchException ime)
(调试),除了它不打印该消息并且只跳转到{{ 1}}和Error, input must be number
。
我的输入缓冲区中是否存在某些东西,我可以将其刷新,为什么它(输入缓冲区)卡住(随机数据)???
我会再次尝试调试,看看我的输入缓冲区中有什么问题,如果我能弄清楚如何看到它。
答案 0 :(得分:2)
问题在于对input.close()
的调用 - 这会导致基础输入流被关闭。当关闭的输入流是System.in
时,会发生不好的事情(即,您无法再从stdin读取)。你应该没关系就行了。
答案 1 :(得分:1)
input.hasNextInt()
如果没有Integer,则该行抛出异常,因此它不会阻止它向前阻塞。如果异常被捕获,它将永远不会阻止。