当前位置: 首页 > 面试题库 >

输入错误的类型时,如何防止扫描仪抛出异常?

井兴怀
2023-03-14
问题内容

这是一些示例代码:

import java.util.Scanner;
class In
{
    public static void main (String[]arg) 
    {
    Scanner in = new Scanner (System.in) ;
    System.out.println ("how many are invading?") ;
    int a = in.nextInt() ; 
    System.out.println (a) ; 
    } 
}

如果我运行该程序并将其设置为int like 4,则一切正常。

另一方面,如果我回答,too many那不会嘲笑我的有趣笑话。相反,我得到这个(如预期的那样):

Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:819)
    at java.util.Scanner.next(Scanner.java:1431)
    at java.util.Scanner.nextInt(Scanner.java:2040)
    at java.util.Scanner.nextInt(Scanner.java:2000)
    at In.main(In.java:9)

有没有一种方法可以使它忽略不是int的条目,或者用“有多少个入侵者”重新提示?我想知道这两种方法。


问题答案:

你可以使用的诸多一个hasNext*是方法Scanner有预验证。

    if (in.hasNextInt()) {
        int a = in.nextInt() ; 
        System.out.println(a);
    } else {
        System.out.println("Sorry, couldn't understand you!");
    }

这可以防止InputMismatchException从甚至被抛出,因为你总是确保它WILL你读它之前匹配。

java.util.Scanner API

  • boolean hasNextInt():返回true是否可以使用nextInt()方法将此扫描器输入中的下一个标记解释为默认基数中的int值。扫描仪不会越过任何输入。

  • String nextLine():使此扫描仪前进到当前行,并返回跳过的输入。

请记住以粗体显示的部分。hasNextInt()不会超过任何输入。如果返回true,你可以通过调用来推进扫描程序nextInt(),不会抛出异常InputMismatchException

如果返回false,则需要跳过“垃圾”。最简单的方法是调用nextLine(),可能两次,但至少一次。

为什么你可能需要做nextLine()两次以下操作:假设这是输入的内容:

42[enter]
too many![enter]
0[enter]

假设扫描仪位于该输入的开头。

  • hasNextInt()是真实的,nextInt()回报42;扫描仪现在位于第一个扫描仪之前[enter]
  • hasNextInt()为假,nextLine()返回一个空字符串,一秒钟nextLine()返回"too many!";扫描仪现在是刚过第二[enter]
  • hasNextInt()是真实的,nextInt()回报0;扫描仪现在在之前第三[enter]
    这是将其中一些内容放在一起的示例。你可以尝试使用它来研究其Scanner工作原理。
        Scanner in = new Scanner (System.in) ;
        System.out.println("Age?");
        while (!in.hasNextInt()) {
            in.next(); // What happens if you use nextLine() instead?
        }
        int age = in.nextInt();
        in.nextLine(); // What happens if you remove this statement?

        System.out.println("Name?");
        String name = in.nextLine();

        System.out.format("[%s] is %d years old", name, age);

假设输入为:

He is probably close to 100 now...[enter]
Elvis, of course[enter]

然后输出的最后一行是:

[Elvis, of course] is 100 years old


 类似资料:
  • 对于作业,我必须编写以下代码: 当我尝试编译它时,它在命令提示符下给了我3个错误,说“无法解析符号,符号:类扫描仪,位置:类单词,扫描仪用户输入=新扫描仪(System.in)”。我不确定错误在哪里。我应该使用BufferedReader作为输入吗?

  • 只是想知道在我完成输入后如何终止程序?因为在几次“输入”之后扫描仪仍然会继续,假设我要继续输入...我试过了: 和 它们不起作用....程序继续运行,打乱了初衷,

  • 为此,我创建了一个名为的单例。这个类处理所有的输入阅读内容。我创建了一个名为的方法,它将回调作为参数。在这个方法中,我创建了一个新线程,并在其中等待使用的输入。这个类还有方法,它向上面描述的线程发送中断消息。下面是该类的当前实现: 这个代码极不可靠。我一会儿就告诉你我的意思。我制作了一个名为Client的玩具类,在中,我用计时器模拟了消息收入。 以下是它的工作原理: 我知道这个问题非常长(也许是不

  • 我对编程相当陌生。目前我正在做一个uni项目,用java创建一个基本的文本游戏。我遇到的问题是,如何实现一个不允许用户输入相同名称的业务规则。我把它设置好了,这样扫描仪就可以读取阵列了。我使用的是Java,这是我第一次使用这个论坛,所以我非常感谢大家提供的帮助,并提前感谢大家!:) 并为糟糕的格式道歉,我不知道如何正确发布。

  • 问题内容: 我是Java的新手学生,正在尝试完成一个使用扫描仪输入5个学生姓名的程序,然后在其中进行循环以为每个学生获得3个成绩。我一直卡在输入错误匹配错误,我不知道为什么。我试图正确匹配将哪些类型的输入输入到变量中。任何帮助将不胜感激! 这就是我所拥有的: 这就是我得到的: 问题答案: 您的问题在第20行。 这意味着在输入中,它期望一个int值,但它会发现另一件事,例如double,char数组