Java 输入读取后出现意外的无限循环

Java 输入读取后出现意外的无限循环,java,Java,我正在尝试创建一个程序,在用户按下enter键之前一直询问问题。但出于某种原因,程序进入一个无限循环,不断输出: “输入操作:需要在集合的开头添加“[”。” 如果您不小心没有遵守规则。现在,程序应该打印该消息,但只打印一次。我认为循环不断地要求执行该操作,但它会直接返回错误(如果您没有输入任何内容,我猜这将被视为没有使用[在开始时]) 我已经知道如何解决它,但因为我尝试了所有方法!!我不确定我的解决方案如何改变任何东西…你能给我一些建议,如何解决它和/或向我解释在最后实现的do-while循环到

我正在尝试创建一个程序,在用户按下enter键之前一直询问问题。但出于某种原因,程序进入一个无限循环,不断输出:

“输入操作:需要在集合的开头添加“[”。”

如果您不小心没有遵守规则。现在,程序应该打印该消息,但只打印一次。我认为循环不断地要求执行该操作,但它会直接返回错误(如果您没有输入任何内容,我猜这将被视为没有使用[在开始时])

我已经知道如何解决它,但因为我尝试了所有方法!!我不确定我的解决方案如何改变任何东西…你能给我一些建议,如何解决它和/或向我解释在最后实现的do-while循环到底有什么好处吗

编辑:TextIO是Eck,D.J.在他的书中编写的一个类。我将在此处链接给出代码的章节:

有问题的代码是

 while (true) {
           System.out.print("\nEnter the operation: ");
           TextIO.skipBlanks();
           if (TextIO.peek() == '\n') { //There is no operation, end the program.
               break;
           }
           try {
               calculation(); 
           }
           catch (IllegalArgumentException e) {
               System.out.println(e.getMessage());
               
           }
}
我实施的解决方案如下所示:

while (true) {
           System.out.print("\nEnter the operation: ");
           TextIO.skipBlanks();
           if (TextIO.peek() == '\n') { //There is no operation, end the program.
               break;
           }
           try {
               calculation(); 
           }
           catch (IllegalArgumentException e) {
               System.out.println(e.getMessage());
               
           }
           do {
               ch = TextIO.getAnyChar(); // Read ahead the "enter". 
               
           } while (ch != '\n'); //If necessary, make sure to stop the error message and keep the loop going.
       }

谢谢大家!!

我不确定什么是文本,你们应该使用标准类。

我不确定什么是文本,你们应该使用标准类。

听起来你们在使用大卫·J·埃克的书中的类

根据班级的不同情况:

[
TextIO.peek()
]返回当前输入源中的下一个字符,,而不实际从输入中删除该字符

您实际上是在检查输入,而没有删除它。这就是为什么在下一次迭代中,循环不断读取相同的错误输入,并无限期地抛出异常

此外,在调用
peek()
删除输入中的字符后,您的修复程序将执行缺少的操作


因此,在第一次尝试中用
getAnyChar()
替换
peek()
可以解决问题。

听起来像是在使用David J.Eck的书中的类

根据班级的不同情况:

[
TextIO.peek()
]返回当前输入源中的下一个字符,,而不实际从输入中删除该字符

您实际上是在检查输入,而没有删除它。这就是为什么在下一次迭代中,循环不断读取相同的错误输入,并无限期地抛出异常

此外,在调用
peek()
删除输入中的字符后,您的修复程序将执行缺少的操作


因此,将
peek()
替换为
getAnyChar()
在您的第一次尝试中解决了这个问题。

什么是
TextIO
?这是一个由我正在使用的书的作者编写的类,它的工作原理通常与Scanner类类似,但有时更简单。我刚刚习惯了使用它。请添加错误跟踪和TextIO类。这就是为什么我认为所有的都必须同时包含导入语句和主要方法。@Amesshel你回答了问题,谢谢!我将把它添加到帖子中。什么是
TextIO
?这是一个由我正在使用的书的作者编写的类,它的工作原理通常与Scanner类类似,但有时更简单。我刚刚习惯使用它。请添加错误跟踪和TextIO类。T这就是为什么我认为所有的都必须包括import语句和main方法。@amesshel你确实回答了这个问题,谢谢!我将把它添加到帖子中。这是一个由我正在使用的书的作者给出和编写的类。它的工作原理相同,但有些方法更容易实现。我刚刚习惯了它们!你能告诉我为什么不使用它吗如果我删除它,程序会因为无限循环而崩溃,我尝试了很多不同的方法,但都不起作用。这是关于TextIO类,我不熟悉,我真的建议你使用传统的Scanner类。这是一个由我写的书的作者给出和编写的类我正在使用。它的工作原理相同,但有些方法更容易实现。我刚刚习惯了它们!你能告诉我为什么do while循环会起作用吗?如果我删除它,程序会因为无限循环而崩溃,我尝试了很多不同的方法,但都不起作用。这是关于TextIO类的,我真的不熟悉建议您使用传统的扫描仪类。