避免 parseInt 为输入字符串抛出 NumberFormatException 的正确方法:“”

Posted

技术标签:

【中文标题】避免 parseInt 为输入字符串抛出 NumberFormatException 的正确方法:“”【英文标题】:Proper way to avoid parseInt throwing a NumberFormatException for input string: "" 【发布时间】:2012-02-05 13:08:34 【问题描述】:

当我运行 parseInt 时:

Integer.parseInt(myString);

它抛出:

NumberFormatException: For input string: ""

这是否意味着我做过这样的事情?

if(StringUtils.isNotBlank(myString))
  return Integer.parseInt(myString);
else
 return 0;

【问题讨论】:

【参考方案1】:

是的,但是:将其包装在一个精简的方法中(并消除多余的else),或者使用现有的实现,例如Commons Lang's NumberUtils.toInt(str, defaultValue)

NumberUtils.toInt(myString, 0);

此方法处理null 值和转换失败。

自己写同样的东西是直截了当的:

检查 null 和/或... ...包装NumberFormatExtension 异常

【讨论】:

【参考方案2】:

好吧,您可以改用条件运算符:

return StringUtils.isNotBlank(myString) ? Integer.parseInt(myString) : 0;

如果您需要在多个地方执行此操作,您可能希望将其放入单独的方法中。请注意,您还应该考虑myString 为空或包含非数字文本的情况。

【讨论】:

【参考方案3】:

如果字符串可以为空,我会这样做:

Integer.parseInt("0" + inputString)

当我不确定它是否只包含数字时:

Integer.parseInt(0 + inputString.replaceAll("\\D+",""))

【讨论】:

我可能是个新手,但为什么这根本不被赞成,这么简单的把戏。更新,刚刚意识到为什么,它会因负值而失败! 这种棘手的方法只适用于无符号整数(正数) 正确。对于一般情况,我会使用一些第三方 *Utils 库(请参阅其他答案) 盲目替换非数字可能会导致用户眼中的意外行为。【参考方案4】:

你所拥有的很好,但作为一种编码风格,我更喜欢让测试“正面”(isBlank),而不是“负面”(isNotBlank),即

if (StringUtils.isBlank(myString)) 
    return 0;

return Integer.parseInt(myString); // Note: No need for else when the if returns

或者,更简洁:

return StringUtils.isBlank(myString) ? 0 : Integer.parseInt(myString);

【讨论】:

【参考方案5】:

是的。 (在对其中的内容进行假设之前验证您的输入。:-)

+1 表示已经找到带有 StringUtils 的 Apache 通用语言。

【讨论】:

【参考方案6】:

Integer.parseInt(String) 不接受非数字输入,包括空值和空字符串。

要么像你建议的那样防范这种情况,要么抓住 NFE。

【讨论】:

【参考方案7】:

我不知道为什么要搜索这个,但这是简单的方法:

int test=str.isEmpty()?0:Integer.parseInt(str);

【讨论】:

如果str 为空,这将引发 NPE。

以上是关于避免 parseInt 为输入字符串抛出 NumberFormatException 的正确方法:“”的主要内容,如果未能解决你的问题,请参考以下文章

判断字符串是否为数字

java --整形字符串转化

java 怎么把字符串转化成整型

解析为 Double 时捕获 numberformatException

为啥 Double.parseDouble(null) 和 Integer.parseInt(null) 会抛出不同的异常?

js基础