封装Integer.parseInt()的好方法

Bad*_*rse 84 java encapsulation exception-handling

我有一个项目,我们经常使用它将Integer.parseInt()String转换为int.当出现问题时(例如,String不是数字而是字母a或其他),此方法将引发异常.但是,如果我必须在我的代码中处理各种异常,那么这很快就会变得非常难看.我想把它放在一个方法中,但是,我不知道如何返回一个干净的值,以表明转换出错了.

在C++中,我可以创建一个接受指向int的指针的方法,让方法本身返回true或false.但是,据我所知,这在Java中是不可能的.我还可以创建一个包含true/false变量和转换值的对象,但这似乎也不理想.对于全局值也是如此,这可能会给我带来一些多线程的麻烦.

那么有一个干净的方法吗?

Jon*_*eet 133

你可以返回一个Integer而不是一个int,返回null解析失败.

遗憾的是,如果没有内部抛出的异常,Java没有提供这样做的方法 - 您可以隐藏异常(通过捕获并返回null),但如果您解析数百个,它仍然可能是性能问题数千位用户提供的数据.

编辑:这种方法的代码:

public static Integer tryParse(String text) {
  try {
    return Integer.parseInt(text);
  } catch (NumberFormatException e) {
    return null;
  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果text为null ,我不确定这会做什么.您应该考虑 - 如果它代表一个错误(即您的代码可能传递无效值,但永远不应传递null),那么抛出异常是合适的; 如果它不代表一个bug,那么你应该像对任何其他无效值一样返回null.

最初这个答案使用了new Integer(String)构造函数; 它现在使用Integer.parseInt和拳击操作; 以这种方式,小值将最终被装箱到缓存Integer对象,使其在这些情况下更有效.

  • 检查"null"引用的代码通常比定期处理异常更清晰. (13认同)
  • @Steve Kuo:为什么?好处在哪里?他们每次都创建一个新的整数?如果有的话,我很想使用Integer.parseInt并让autoboxing处理它,以利用缓存获取小值. (2认同)

Joa*_*uer 34

当它不是数字时,你期望什么行为?

例如,如果您在输入不是数字时经常使用默认值,那么这样的方法可能很有用:

public static int parseWithDefault(String number, int defaultVal) {
  try {
    return Integer.parseInt(number);
  } catch (NumberFormatException e) {
    return defaultVal;
  }
}
Run Code Online (Sandbox Code Playgroud)

当无法解析输入时,可以为不同的默认行为编写类似的方法.


Bry*_*ner 26

在某些情况下,您应该将解析错误作为快速失败的情况处理,但在其他情况下,例如应用程序配置,我更喜欢使用Apache Commons Lang 3 NumberUtils处理缺省值的输入.

int port = NumberUtils.toInt(properties.getProperty("port"), 8080);
Run Code Online (Sandbox Code Playgroud)


Dad*_*boy 16

为避免处理异常,请使用正则表达式以确保首先包含所有数字:

if(value.matches("\\d+") {
    Integer.parseInt(value);
}
Run Code Online (Sandbox Code Playgroud)

  • 小心.正则表达式匹配一个以0开头的整数,然后抛出一个NumberFormatException.试试这个^(?:[1-9]\d*| 0)$来自http://stackoverflow.com/questions/12018479/javascript-regex-for-integer-only-not-to-start-with-0 - 丁允许-0 (3认同)
  • 这也不包括超出整数范围的数字范围 (3认同)
  • 这个特殊的正则表达式不会处理负数. (2认同)

hus*_*ayt 10

Ints.tryParse()番石榴.它不会在非数字字符串上抛出异常,但它会在空字符串上抛出异常.