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");
}
}
我该怎么解决呢?
第二次我什么都写不出来。
当您出现意外行为时,您应该首先处理文档。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
:
scan
无法将abc
转换为整数,因此会引发异常。但是请注意,scan
坚持abc
,它并不只是消失:
System.in:
扫描:abc
输入:
同样的事情再次发生,它试图将abc
转换为整数,但不能,因此它再次抛出异常。看到无限循环发生了吗?
System.in:abc
扫描:
行:
输入:
scan
从输入流中读取abc
,因为我告诉它读取下一行:
System.in:
扫描:abc
行:
输入:
代码试图将abc
解析为一个整数,但它不能,因此它进入下一个循环迭代。行
对于循环的每次迭代都是本地的,因此它的旧值会被抛出:
System.in:
扫描:
行:
输入:
我在输入流中输入123
:
扫描
将数据传递到行
,因为它符合一行文本的条件:
System.in:
扫描:
行:123
输入:
代码成功地将123
解析为整数,并将其分配给input
。没有无限循环,程序已经完成。
问题内容: 我想做的是请用户输入一些字符串以读入数组,然后要求用户输入该数量的字符串并将其读入数组。当我运行此代码时,它从不要求我在第一个for循环的第一个循环中输入内容,只打印出“字符串#0:字符串#1:”,然后我就可以输入文本了。为什么会这样,我做错了什么? 问题答案: 缓冲。 输入输入数量时,不会在输入缓冲区中占用换行符的位置。在for循环的迭代0中,缓冲区中已经有一行输入,并且可以立即完成
问题在代码的注释中,很抱歉,我认为它更整洁,因为流程很重要,我想。。。 //*这是来自Oracle:(https://docs.oracle.com/javase/6/docs/api/java/util/Scanner.html#hasNextInt()) ”hasNextInt 公共布尔值hasnetint() 如果此扫描仪输入中的下一个标记可以使用nextInt()方法解释为默认基数中的in
我有两个循环。在第一个循环中,我分割字段(分割)。在第二个循环中,我想打印新的字段值。只有0。我想知道循环有什么问题。我没有发现错误。:)我认为问题出在这方面: 我在Windows 7中使用Visual Studio 2013编程。 %lf输出(正确): %f输出(不正确):
如下所示,我要反转数组。但我的代码不管用。这是我的for循环。请看一下。这个for循环正确吗。代码如下。
问题内容: 我试图制作一个采用用户输入的多个名称的,直到插入单词为止,但我不确定如何使用。如何实现呢? 问题答案: