java - 我的循环进入一个无限循环。我该如何解决?我不能在第二个循环中输入输入
问题描述
import java.util.InputMismatchException;
import java.util.Scanner;
public class h {
/** Test Function.
* @param args Kommandozeilenparameter
*/
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int input;
boolean check = false;
do {
try {
System.out.println("give me a number: ");
input = scan.nextInt();
check = true;
} catch (InputMismatchException e) {
System.out.println("Eingabe ist falsch");
}
} while (!check);
System.out.println("getout");
}
}
我正在尝试检查用户是否提供整数作为输入。我试图在 try catch 和 do while 循环的帮助下捕捉它。
但它进入了一个无限循环。
我该如何解决?
第二次我什么都写不出来。
解决方案
当您有意外行为时,您应该首先去的地方是文档。 scan.nextInt()
仅在可以将其转换为整数时才使用输入。否则,它将保留在扫描仪的缓冲数据中。因此,如果用户输入一个字母,则该字母永远不会被消耗,scan.nextInt()
只是一遍又一遍地阅读同一个字母,并且因为它不是整数,所以它会一直循环。解决方法是简单地将扫描仪的输入读取为字符串,无论它是否可以解释为整数。然后你可以自己检查它是否是一个整数,并且输入已经被消耗掉了。这是您的示例,已修改:
Scanner scan = new Scanner(System.in);
int input;
boolean check = false;
do {
try {
System.out.println("give me a number: ");
// This retrieves the next line of input, without converting it to an integer:
String line = scan.nextLine();
// This tries to convert it to an integer,
// and throws a NumberFormatException if it can't:
input = Integer.parseInt(line);
check = true;
} catch (NumberFormatException e) {
System.out.println("Eingabe ist falsch");
}
} while (!check);
System.out.println("getout");
为了帮助您将我的解释形象化,我将写出一个示例输入,然后我将显示每个步骤中数据的位置。假设我abc
使用您的原始代码进入控制台。然后程序进入一个无限循环,原因如下:
我进入abc
输入流:
System.in:abc
扫描:
输入:
scan
abc
在尝试查找整数时从输入流中读取:
System.in:
扫描:abc
输入:
scan
无法转换abc
为整数,因此会引发异常。但请注意,scan
坚持到abc
,它不仅会消失:
System.in:
扫描:abc
输入:
同样的事情再次发生,它试图转换abc
为整数,但它不能,所以它再次抛出异常。看到无限循环发生了吗?
System.in:
扫描:abc
输入:
现在让我们试试我的代码。我将输入abc
,然后123
:
我进入abc
输入流:
System.in:abc
扫描:
行:
输入:
scan
从输入流中读取abc
,因为我告诉它读取下一行:
System.in:
扫描:abc
行:
输入:
scan
将数据传递给line
,因为它符合一行文本的条件:
System.in:
扫描:
行:abc
输入:
代码试图解析abc
成一个整数,但它不能,所以它进入下一个循环迭代。 line
对于循环的每次迭代都是本地的,因此它的旧值被丢弃:
System.in:
扫描:
行:
输入:
我进入123
输入流:
System.in:123
扫描:
行:
输入:
scan
从输入流中读取123
,因为我告诉它读取下一行:
System.in:
扫描:123
行:
输入:
scan
将数据传递给line
,因为它符合一行文本的条件:
System.in:
扫描:
行:123
输入:
该代码成功解析123
为一个整数,并将其分配给input
. 没有无限循环,程序已经完成。
System.in:
扫描:
行:
输入:123
推荐阅读
- firebase - 未获得从 Playstore 下载应用程序的用户的 Firebase 动态链接
- jenkins-x - 为什么 jx install 运行 chrome 来获取管理员令牌?
- c++ - 调用函数时,C++ 中的 ptr** 和 ptr*& 之间有区别还是首选?
- c# - C# 使用 MySQL 的多种形式
- angularjs - 由 AngularJS 路由器解释的百分比“%”符号
- java - 是否可以通过java中的反射更改默认初始字段值?
- elasticsearch - 休眠查询不搜索超过 2 个字符的某些字符串并且不进行多字搜索
- xaml - 报告和发票 UWP 应用程序
- json - 是否可以通过 JsonPatchDocument 更新嵌套在数组中的对象?
- python - 如何将文本文件中的数据导入python的循环