Java 输入不匹配异常…即使使用try/catch

Java 输入不匹配异常…即使使用try/catch,java,while-loop,java.util.scanner,do-while,inputmismatchexception,Java,While Loop,Java.util.scanner,Do While,Inputmismatchexception,所以我在这里写代码只是为了好玩,但我遇到了一个似乎无法修复的错误。这段代码应该包含一个整数。。。起初,我在while循环中单独使用hasNextInt()来尝试确保获得正确的输入,但正如命运所赐。。我有个例外。然后我又加了一个试一试,想也许我只是做错了什么。。。但我还是犯了同样的错误。我不知道这里出了什么问题。这实际上是我第一次使用try-catch块(还是一种noob)。这对我来说很好,我在网上查阅了文档,做了一些小的研究,但没有结果。有人能确定这里出了什么问题吗? 请查看: do{

所以我在这里写代码只是为了好玩,但我遇到了一个似乎无法修复的错误。这段代码应该包含一个整数。。。起初,我在while循环中单独使用hasNextInt()来尝试确保获得正确的输入,但正如命运所赐。。我有个例外。然后我又加了一个试一试,想也许我只是做错了什么。。。但我还是犯了同样的错误。我不知道这里出了什么问题。这实际上是我第一次使用try-catch块(还是一种noob)。这对我来说很好,我在网上查阅了文档,做了一些小的研究,但没有结果。有人能确定这里出了什么问题吗? 请查看:

do{
    System.out.println("How much AP do you want to allocate towards HP? ");

    try {//added try catch... still throwing the exception..

        while(!in.hasNextInt()){//this should've been enough, apparently not
            System.out.println("That is not a valid input, try again.");
            in.nextInt();
            }
    } catch (InputMismatchException e) {
        System.out.print(e.getMessage()); //trying to find specific reason.
    }
    hpInput = in.nextInt();
}while(hpInput < 0 || hpInput > AP);
do{
System.out.println(“您希望向HP分配多少AP?”);
try{//添加了try-catch…仍在引发异常。。
虽然(!in.hasNextInt()){//这应该足够了,但显然不行
System.out.println(“这不是有效的输入,请重试。”);
in.nextInt();
}
}捕获(输入不匹配异常e){
System.out.print(e.getMessage());//正在尝试查找具体原因。
}
hpInput=in.nextInt();
}而(hpInput<0 | | hpInput>AP);

如果我输入一个字符串,它会给我一个“这不是一个有效的输入,请再试一次。”行。。但是异常仍然会在之后立即发生,而不是在检测到实际int之前循环。。。帮助plz..

在输入某个内容之前,您无法真正验证
扫描仪中的值,但一旦输入,验证就太晚了

例如,您可以使用第二个
扫描仪
来验证通过键盘从用户处获得的
字符串
结果

Scanner kbd = new Scanner(System.in);
int result = -1;
do {
    System.out.println("How much AP do you want to allocate towards HP? ");
    String value = kbd.nextLine();
    Scanner validate = new Scanner(value);
    if (validate.hasNextInt()) {
        result = validate.nextInt();
    }
} while (result < 0);
Scanner kbd=新扫描仪(System.in);
int结果=-1;
做{
System.out.println(“您希望向HP分配多少AP?”);
字符串值=kbd.nextLine();
扫描仪验证=新扫描仪(值);
if(validate.hasNextInt()){
结果=validate.nextInt();
}
}而(结果<0);

您的
while
循环应该如下所示

while(!in.hasNextInt()){ // <-- is there an int?
    System.out.println("That is not a valid input, try again.");
    // in.nextInt(); // <-- there is not an int...
    in.next(); // <-- this isn't an int.
}

while(!in.hasNextInt()){//你在倒着问这个问题,你在检查输入是否有效,然后要求用户输入一个新值……最好是将输入作为
字符串
,然后使用另一个
扫描仪
来验证它……我明白了……好的,我现在就试试,谢谢。所以让我试着进一步了解一下……这里的值=kbd.nextLine()我以为这只是字符串输入?但是如果输入一个int而不是字符串…它就接受它。我遗漏了什么吗?顺便说一句,它现在可以工作了,非常感谢,我只是想真正理解代码在这里做什么。是的,
kdb.nextLine
基本上从输入中提取所有新行标记,然后重新开始将其转换为
字符串
,然后您可以使用单独的
扫描仪
,在本例中。。。