Java异常(java.util.InputMismatchException)

时间:2016-01-19 17:42:16

标签: java java.util.scanner


我定义了一个函数readInt(),它返回int(基于Scanner.nextInt())。

问题是:如果我输入一个角色,我会得到这个例外:(java.util.InputMismatchException)。

我尝试使用try-catch阻止修复但未成功。

怎么了?

public static int readInt(String message, int min, int max)
{
    displayBlack(message);
    int number = scanner.nextInt();

    try{
        if (number < min || number > max)
        {
            return readInt("Erreur, Selectionner un nombre entre " + min + " et " + max, min, max);
        } else
        {
            return number;
        }
    }
    catch (NumberFormatException e){
            return readInt(message, min, max);
    }
}



编辑:

我将我的功能改为:

public static int readInt(String message, int min, int max)
{
    displayBlack(message);

    try{
        String result = scanner.next();
        int number = Integer.parseInt(result);

        if (number < min || number > max)
        {
            return readInt("Erreur, Selectionner un nombre entre " + min + " et " + max, min, max);
        } else
        {
            return number;
        }
    }
    catch (Exception e){
            return readInt("Erreur, Selectionner un nombre entre " + min + " et " + max, min, max);
    }
}

现在它正在运作。这是一个好方法还是一个肮脏的黑客?

3 个答案:

答案 0 :(得分:1)

我相信你误解了错误的来源。你的try / catch看起来好像是超出了界限错误(例如太大而不是int或者太小)但是忽略了我认为是错误所在的scanner.nextInt()。尝试将它放在这样的try / catch中并使用它直到你得到正确的结果。

displayBlack(message);
try {
    int number = scanner.nextInt();
} catch(Exception e) { //Just using this as a catch all - you might want to be more specific.
    ...

答案 1 :(得分:0)

我已经修改了一下你的代码。

public static Integer readInt(String message, int min, int max)
{
    /*displayBlack(message);*/

    try {
        /*String result = scanner.next();*/
        int number = Integer.parseInt(message);

        if (number < min || number > max) {
            System.out.println("Erreur, Selectionner un nombre entre " + min + " et " + max);
            /*return readInt();*/
        }
        return number;
    } catch (InputMismatchException e) {
        System.out.println("You must enter a number: " + e.toString());
        return null;
    } catch (NumberFormatException e) {
        System.out.println("You must enter a number: " + e.toString());
        return null;
    } catch (Exception e) {
        System.out.println("Another problem:" + e.toString());
        return null;
    }
}

我使readInt返回一个Integer(如果数字无效,则可以为null)。

我注释掉了scanner.next语句,因为你似乎是通过消息传递它。

return语句只能返回方法签名中声明的类型的对象。由于您将其声明为int,因此只能返回int。我声明它是一个Integer,所以它可以返回一个int或null。请注意,它不能像您一样返回String。

我在最广泛的Exception之前添加了两个捕获,即InputMismatchExceptionNumberFormatException

我用这两个陈述测试了它:

    Integer test = StackoverflowApplication.readInt("42", 0, 10);
    Integer readMe = StackoverflowApplication.readInt("c", 0, 10);

第一个返回42(打印出“Erreur”消息时),第二个返回null。我抛出一个NumberFormatException。

答案 2 :(得分:-1)

您正在获取InputMismatchException,因为您使用了Scanner的nextInt(),它只在您给出字符时接受整数。如果你想接受字符串参数,那么你必须尝试next()或其他东西。希望它可以帮助你...