防止用户输入大于 int max 的值?

Prevent user from inputting value larger than int max?

我有一些采用 int 值的很酷的代码。我让小弟测试一下,他做的第一件事是什么?他输入:

12345678910

他得到了这个错误:

User did not input a number. (Error Code 1)

那不是真的。有没有办法给他 "value too large" 一个不同的错误?这是我的代码:

try
{
    number = input.nextInt();
}
catch (InputMismatchException e)
{
    System.err.println("User did not input a number. (Error Code 1)");
    System.exit(1);
}

谢谢!

编辑

我使用的发布的代码已被修改。这是我最终使用的代码,但解决方案不再在评论中。

        try 
        {
            double intitalinput = input.nextDouble();

            if (intitalinput > Integer.MAX_VALUE)
            {
                System.err.println("User entered a number larger than " + Integer.MAX_VALUE + ". (Error Code 2)");
                System.exit(2);
            }
            else 
            {
                number = (int) intitalinput;
            }
        }
        catch (InputMismatchException e) 
        {
            System.err.println("User did not input a number. (Error Code 1)");
            System.exit(1);
        }

感谢 Jay Harris 解决了我的问题!

编辑第二个

我添加了一个 'less than zero' 检查。如果其他人偶然发现这个问题需要类似的帮助,我将在此处显示更新后的代码:

try 
{
    double intitalinput = input.nextDouble();

    if (intitalinput > Integer.MAX_VALUE)
    {
        System.err.println("User entered a number larger than " + Integer.MAX_VALUE + ". (Error Code 2)");
        System.exit(2);
    }
    else if (intitalinput < 0)
    {
        System.err.println("User entered a number smaller than 0. (Error Code 3)");
        System.exit(3);
    }
    else 
    {
        number = (int) intitalinput;
    }
}
catch (InputMismatchException e) 
{
    System.err.println("User did not input a number. (Error Code 1)");
    System.exit(1);
}

尝试使用 Scanner.hasNextInt() 方法:

来自http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#hasNextInt()

Returns true if the next token in this scanner's input can be interpreted as an int value in the default radix using the nextInt() method. The scanner does not advance past any input.

if (input.hasNextInt()) {
    number = input.nextInt();
} else {
    System.err.println("User did not input a number. (Error Code 1)");
    System.exit(1);

}

如果您想检测输入的数字,但它可能太大而无法解析,请尝试以下方法:

   public static void main(String[] args) {

       Scanner input = new Scanner(System.in);
       System.out.println("Enter a number:");
       if (input.hasNextInt()) {
           int num = input.nextInt();
           System.out.println("num is " + num);
       } else {
           String s = input.next();
           boolean isaNumber = true;
           for (int i=0; i<s.length(); i++) {
               if (!Character.isDigit(s.charAt(i))) {
                   isaNumber = false;
                   break;
               }
           }
           if (isaNumber) {
               System.out.println("It appears you entered a number, but it canntot "
                    + "be read.  It might be too large.");
           } else {
               System.out.println("Error parsing number.");
           }
       }
   }

在这里,我只是检查输入中的每个字符是否为数字。如果是这样,我认为它是一个数字。这段代码当然可以清理,并且可能不是 100% 防弹的。我只是想说明解决您的问题的可能方法。

this answer所示,您可以将输入存储在long中,然后检查数字是否太大。或者,您可以将所有值更改为 long 类型。

大数不会return编译器本身的异常;您 运行 的错误可能是因为 int 不能容纳超过 20 亿的值。相反,您可以尝试将 number 声明为 long 类型。

另一种解决方案是首先使用字符串获取输入,如@karfau 所述。这可以通过使用 length() 方法专门完成;如果字符串超过一定的字符数,就知道输入太长了。

您可以尝试获得 long,但这只会提高限制,并不能解决问题。

另一种方法是获取字符串形式的值,并在尝试转换它之前使用一些正则表达式检查它是否为数字。如果转换失败则数字太大。

有很多方法可以实现这一点,例如检查更大的数字并使用 Integer.MAX_VALUEInteger.MIN_VALUE 根据 Integer 的最大和最小大小验证它。

// long userInput = input.nextLong()
// or
double userInput = input.nextDouble();

// expecting an integer but user put a value larger than integer
if (userInput > Integer.MAX_VALUE || userInput < Integer.MIN_VALUE) {
   // Throw your error
}  else {
   // continue your code the number is an int
   number = (int) userInput;
}

你可以用 try-catch 块包围它。

查看 this question 的第一个答案了解更多详细信息。