封装 Integer.parseInt() 的好方法

新手上路,请多包涵

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

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

那么有没有一种干净的方法来做到这一点?

原文由 Bad Horse 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 587
2 个回答

您可以返回 Integer 而不是 int ,在解析失败时返回 null

遗憾的是 Java 没有提供在内部抛出异常的情况下执行此操作的方法 - 您可以隐藏异常(通过捕获它并返回 null),但如果您解析数百个,它仍然可能是一个性能问题数千比特的用户提供的数据。

编辑:这种方法的代码:

 public static Integer tryParse(String text) {
  try {
    return Integer.parseInt(text);
  } catch (NumberFormatException e) {
    return null;
  }
}

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

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

原文由 Jon Skeet 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

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

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

原文由 Joachim Sauer 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题