所以,我被这段代码困住了:
import java.util.InputMismatchException;
import java.util.Scanner;
public class ConsoleReader {
Scanner reader;
public ConsoleReader() {
reader = new Scanner(System.in);
//reader.useDelimiter(System.getProperty("line.separator"));
}
public int readInt(String msg) {
int num = 0;
boolean loop = true;
while (loop) {
try {
System.out.println(msg);
num = reader.nextInt();
loop = false;
} catch (InputMismatchException e) {
System.out.println("Invalid value!");
}
}
return num;
}
}
这是我的输出:
插入整数:
无效值!
插入整数:
无效值!
...
5条答案
按热度按时间yfjy0ee71#
whiledo的保护是“loop”变量。
在代码到达赋值循环之前抛出的异常本身=false;准确地说,异常是在前面的语句num=reader.nextint()中抛出的;
当抛出异常时,“loop”变量的值为“true”,但您的代码跳转到catch块,然后重复while do。这个whiledo永远不会停止,因为下一次迭代将再次抛出异常,再次跳转到catch块等等。
要终止此while do,您需要使用另一个逻辑操作来保护while do,例如:
当读卡器获取非整数字符时退出
eof时退出
这可以在catch block或其他行中完成。但精确的解决方案取决于您的规格。
kkbh8khc2#
就我个人而言,我使用bufferedreader和inputstreamreader来读取字符串并检查是否是一个数字,但使用scanner的代码更少。代码已检查并正常运行。
omhiaaxx3#
您也可以尝试以下方法:
ddarikpa4#
根据扫描仪的javadoc:
当扫描器抛出inputmismatchexception时,扫描器不会传递导致异常的令牌,因此可以通过其他方法检索或跳过它。
这意味着如果下一个令牌不是
int
,它抛出InputMismatchException
,但令牌留在那里。所以在循环的下一次迭代中,reader.nextInt()
再次读取相同的令牌并再次抛出异常。你需要的是用完它。添加reader.next()
在你的catch
使用令牌,该令牌无效,需要丢弃。qq24tv8q5#
我要做的是使用scanner.nextline()读取整行内容。然后创建另一个扫描程序来读取返回的字符串。
这将使您的示例函数如下所示:
这样你就有了一个扫描仪来获取输入,还有一个对输入进行验证,这样你就不用担心读者会关心他们是否输入了正确的输入格式。