8

我已经看到了两种检查变量是否是 Java 中有效整数的样式。通过执行Integer.parseInt并捕获任何由此产生的异常来实现。另一种是使用模式。以下哪个是更好的方法?

String countStr;
int count;
try {
    count = Integer.parseInt(countStr);
} catch (Exception e) {
    //return as the variable is not a proper integer.
    return;
}

或者

String integerRegex = "([0-9]{0,9})";
if (countStr.isEmpty() || !Pattern.matches(integerRegex, countStr)) {
    //return as the variable is not a proper integer.
    return;
}

我的问题是,执行Integer.parseInt()并捕获异常以进行验证是验证的标准方法int吗?我承认我的正则表达式并不完美。但是 Java 中是否有任何用于验证 int 的内置方法?实际上,做一些验证而不是简单地捕获异常不是更好吗?

4

4 回答 4

8

使用上述方法会更好,因为它会考虑所有类型的可能错误并处理所有情况。例如,您所写的内容不会正确解析负数。

如果您想验证所有整数的给定子集,编写自己的验证器才有意义。

一般建议:除非您有充分的理由这样做,否则不要重新发明轮子。

于 2013-06-13T11:07:34.680 回答
4

如果您真的想检查给定的字符串是否可以表示为 32 位整数,而不仅仅是它表示数学意义上的整数,那么有一个非常好的理由不采用第二种方法。

我相信我们都同意2147483648(2**31 对于那些关注的人)是一个完美的整数,但它只是无限多个数字中的一个,这两个选项会给出不同的结果。因此,如果您想检查是否可以将字符串表示为 32 位整数,请使用该parseInt方法,如果您只想查看它是否是整数,请使用正则表达式。

PS:也就是说不要捕获异常,而是正确的 NumberFormat 异常..

于 2013-06-13T11:40:42.500 回答
3

这两个功能有不同的用途。如果您只想确保字符串包含特定模式,请使用第二种方法。如果你需要转换它,那么你应该可以parseInt()在这种情况下,检查它并转换它是没有意义的。

但是,如果您对数字有特定要求,那么您可能必须先检查它,因为parseInt()如果它可以解析仍然不符合您要求的内容,则可能不会总是抛出异常。

于 2013-06-13T11:07:55.757 回答
-1

如果你只是验证一个整数,我认为第二种方法更好。

这两种方法都可以正常工作,但明显不同的重点。前者侧重于转换本身,而后者显然更关注检查。而且你要查的是一个数,所以我觉得第二种方法比较好。另外,我认为,第二种方法更具可读性,允许代码维护是显而易见的,其中逻辑是检查数字的有效性而不是将字符串转换为数字。

于 2013-06-13T11:14:06.920 回答