尝试在while循环中执行try-catch语句时遇到问题。我要求用户首先输入字母然后输入一个数字,如果他正确输入数字,程序结束。如果他输入字母而不是数字,程序应该说"发生错误请输入数字"并要求用户再次输入数字,但每次我输入字母而不是数字时,程序进入无限循环并且不允许我输入新值。 然后就去吧 "发生错误,您必须输入数字" "请输入数字"。
public class OmaBrisem {
public static void main(String[] args) {
Scanner tastatura = new Scanner(System.in);
boolean b = true;
int a = 0;
String r = "";
System.out.println("Please enter a letter");
r = tastatura.next();
do {
try {
System.out.println("Please enter numerical value");
a = tastatura.nextInt();
b = true;
} catch (Exception e) {
System.out.println("An error occured you must enter number");
b = false;
}
} while (!b);
}
}
答案 0 :(得分:6)
这是你的问题。如果用户输入了您希望输入数字的非数字,则nextInt()
会引发异常,但它不会从输入流中删除该字母!
这意味着当您循环返回以再次获取该号码时,该字母将仍,并且您的nextInt()
将再次引发异常。等等,无限制地(或者至少直到宇宙的热量死亡,或者机器最终崩溃,以先到者为准)。
解决此问题的一种方法是在nextInt()
失败时实际读取/跳过下一个字符,以便从输入流中删除它。您基本上可以使用Scanner.findInLine(".")
执行此操作,直到Scanner.hasNextInt()
返回true。
以下代码显示了一种方法:
import java.util.Scanner;
public class MyTestProg {
public static void main(String [] args) {
Scanner inputScanner = new Scanner(System.in);
System.out.print("Enter letter, number: ");
// Get character, handling newlines as needed
String str = inputScanner.findInLine(".");
while (str == null) {
str = inputScanner.nextLine();
str = inputScanner.findInLine(".");
}
// Skip characters (incl. newline) until int available.
while (! inputScanner.hasNextInt()) {
String junk = inputScanner.findInLine(".");
if (junk == null) {
junk = inputScanner.nextLine();
}
System.out.println("Ignoring '" + junk + "'");
}
// Get integer and print both.
int num = inputScanner.nextInt();
System.out.println("Got '" + str + "' and " + num);
}
}
以下成绩单显示了它的实际效果:
Enter letter, number: Abcde42
Ignoring 'b'
Ignoring 'c'
Ignoring 'd'
Ignoring 'e'
Got 'A' and 42
答案 1 :(得分:1)
我意识到我的程序在try块中忽略了Scanner对象tastatura,每当我插入错误的值并且while循环再次启动时,我创建了Scanner类的新对象并将其命名为tastatura2并且我的程序正常工作。
Scanner tastatura = new Scanner(System.in);
boolean b = true;
int a = 0;
String r = "";
System.out.println("Please enter a letter");
r = tastatura.next();
do {
try {
Scanner tastatura2 = new Scanner(System.in);
System.out.println("Please enter numerical value");
a = tastatura2.nextInt();
b = true;
} catch (Exception e) {
System.out.println("An error occured you must enter number");
b = false;
}
} while (!b);
答案 2 :(得分:0)
只需在tastatura.nextLine()
块中添加catch
即可丢弃最后一个输入。
答案 3 :(得分:0)
当捕获到异常时,您可以通过break;
离开循环...所以只需添加:
break;
在你的捕获座上:)
catch子句看起来像这样:
catch (Exception e) {
System.out.println("An error occured you must enter number");
b = false;
break;
}