在尝试处理输入不是数字的int时,我遇到了一个错误

时间:2016-10-18 01:31:48

标签: java exception-handling int try-catch numberformatexception

我不确定如何设置它,但我的方法有一个用户输入一个介于最小值和最大值之间的数字,虽然我不知道如何使用{{1来处理NumberFormatException阻止。关于如何解决这个问题,有什么建议吗?

try-catch

2 个答案:

答案 0 :(得分:0)

static int promptForInt(String prompt, int min, int max){
    System.out.println(prompt);
    String input = in.readLine();
    int parsedInt;
    boolean exceptionThrown = false;
    do {
        try {
            parsedInt = Integer.parseInt(input);
        } catch(NumberFormatException e) {
            exceptionThrown = true;
        }
        if (exceptionThrown || (!(parsedInt > min && parsedInt < max)) {
            System.out.println("Your input is invalid. " + prompt);
            input = in.readLine();
            parsedInt = Integer.parseInt(input);
        } else {
            return parsedInt;
        }
    } while(true)
}

从我关于NumberFormatException的帖子

广告。 4。

最后,我们来到了我们同意的地方,我们无法避免用户输入的情况&#34; abc&#34;作为数字字符串。为什么?因为他可以。在一个幸运的情况下,这是因为他是一个测试人员或者只是一个极客。在一个糟糕的情况下,它是攻击者。

我现在能做什么?嗯,Java给了我们try-catch你可以做到以下几点:

try {
    i = Integer.parseInt(myString);
} catch (NumberFormatException e) {
    e.printStackTrace();
    //somehow workout the issue with an improper input. It's up to your business logic.
}

Exceptions

在Java中,异常用于标记意外情况。例如,将非数字String解析为数字(NumberFormatException)或在null引用(NullPointerException)上调用方法。你可以通过多种方式捕捉它们。

try{
    //some code
} catch (NumberFormatException e1) {
    e.printStackTrace()     //very important - handles the Exception but prints the information!
} catch (NullPointerException e2) {
    e.printStackTrace();
}

或使用这一事实,他们都扩展Exception

try {
    //somecode
} catch (Exception e) {
    e.printStackTrace;
};

或者自Java 7以来:

try {
    //somecode
} catch (NullPointerException | NumberFormatException e) {
    e.printStackTrace;
};

答案 1 :(得分:-1)

如果你把它们当作方法而尝试做事情可以更容易处理:#34;尝试做某事,但由于X&#34;它无法实现。 X是个例外。

以下代码可能是您修改代码以处理异常的一种方式:

static int promptForInt(String prompt, int min, int max) {
    Integer parsedInt = null; // use an Integer so null can be used to mean an invalid value
    while (parsedInt == null) {
        System.out.println(prompt);
        String input = in.readLine();
        int temp;
        try {
            temp = Integer.parseInt(input);
        } catch(NumberFormatException e) {
            System.out.print(input+" is not a number.  ");
            continue;
        }
        if (temp < min || temp > max) {
            System.out.print("Your number must be between "+min+" and "+max+" (inclusive).  ");
        } else {
            parsedInt = temp;
        }
    }
    return parsedInt;
}

您应注意的一些事项:首先,您尚未定义in。你可以这样做:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));

如果你这样做,你很快就会发现你还有另外一个Exception要处理:这会抛出UnsupportedEncodingException,而readLine也会抛出IOException。

您的方法必须返回一个有效的整数,否则它将不会退出(您确实应该为用户提供一些退出循环的方法而不输入有效数字)。例如,如果您无法从System.in读取任何内容,那么这是不可能的。您的方法需要一种合理的方式告诉来电者:&#34;我试图获得一个来自用户的int,除了我被X&#34;停止。

你可能最终会做更多的事情:

static int promptForInt(String prompt, int min, int max) throws UserInputException {
    BufferedReader in;
    try {
        in = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));
    } catch(UnsupportedEncodingException unsupported) {
        // create a new exception and supply the cause as an inner exception
        throw new UserInputException("Could not open a reader for System.in", unsupported);
    }
    Integer parsedInt = null; // use an Integer so null can be used to mean an invalid value
    while (parsedInt == null) {
        System.out.println(prompt);
        String input;
        try {
            input = in.readLine();
        } catch (IOException ioException) {
            throw new UserInputException("Could not read a line", ioException);
        }
        if (input.length() == 0) {
            throw new UserInputException("User aborted input");
        }
        int temp;
        try {
            temp = Integer.parseInt(input);
        } catch(NumberFormatException e) {
            System.out.print(input+" is not a number.  ");
            continue;
        }
        if (temp < min || temp > max) {
            System.out.print("Your number must be between "+min+" and "+max+" (inclusive).  ");
        } else {
            parsedInt = temp;
        }
    }
    return parsedInt;
}