不热衷于使用parseInteger
解决方案,它很丑陋,正如Joshua Bloch所说,你应该“仅在特殊条件下使用例外”。当然,我可以使用下面的代码块,但它不能保证它是一个整数。
for (char c : str.toCharArray())
{
if (!Character.isDigit(c)) return false;
}
return true;
答案 0 :(得分:1)
“仅针对特殊情况使用例外”是一种很好的做法,但这不是一个严格的规则。我认为这是使用例外优于备选方案的情况之一。
由于parseInteger()
可以返回任何可能的int
值,因此您不能使用任何其他返回值来指示失败。如果您知道自己永远不会处理特定值(例如-1
或-2147483648
),则可以将其作为标记值返回以指示解析失败。
唯一的选择是返回表示成功或失败的boolean
,并将解析后的值存储到参数中。但是,由于函数调用总是在Java中按值传递,因此您需要创建一个新类来执行此操作:
public class IntWrapper
{
int value;
}
...
public static boolean myParseInt(String s, IntWrapper outValue)
{
try
{
outValue.value = Integer.parseInt(s);
return true;
}
catch(NumberFormatException e)
{
return false;
}
}
...
IntWrapper value = new IntWrapper();
if (myParseInt(value))
{
// Use value.value
}
else
{
// Parsing failed
}
鉴于这些替代方案,我认为最简单的用法就是使用异常并适当地处理它们,即使非数字输入可能不一定是“例外”条件。
答案 1 :(得分:0)
我将异常保留,但如果您真的想要解决方案而无异常,您可以使用java内部类从this站点复制方法parseInt()并稍微更改一下
(你可以多修改一下,因为你不需要结果)
public static false isValidInt(String s, int radix)
throws NumberFormatException
{
if (s == null) {
return false;
}
if (radix < Character.MIN_RADIX) {
return false;
}
if (radix > Character.MAX_RADIX) {
return false;
}
int result = 0;
boolean negative = false;
int i = 0, len = s.length();
int limit = -Integer.MAX_VALUE;
int multmin;
int digit;
if (len > 0) {
char firstChar = s.charAt(0);
if (firstChar < '0') { // Possible leading "-"
if (firstChar == '-') {
negative = true;
limit = Integer.MIN_VALUE;
} else
return false;
if (len == 1) // Cannot have lone "-"
return false;
i++;
}
multmin = limit / radix;
while (i < len) {
// Accumulating negatively avoids surprises near MAX_VALUE
digit = Character.digit(s.charAt(i++),radix);
if (digit < 0) {
return false;
}
if (result < multmin) {
return false;
}
result *= radix;
if (result < limit + digit) {
return false;
}
result -= digit;
}
} else {
return false;
}
return true;
}
答案 2 :(得分:0)
您可以使用:
public static boolean isInteger(String str) {
if (str == null) {
return false;
}
int length = str.length();
if (length == 0) {
return false;
}
int i = 0;
if (str.charAt(0) == '-') {
if (length == 1) {
return false;
}
i = 1;
}
for (; i < length; i++) {
char c = str.charAt(i);
if (c <= '/' || c >= ':') {
return false;
}
}
return true;
}
这里已经回答:What's the best way to check to see if a String represents an integer in Java?