【问题标题】:Should one check if a string is empty before calling Integer.parseInt?是否应该在调用 Integer.parseInt 之前检查一个字符串是否为空?
【发布时间】:2018-06-06 12:53:48
【问题描述】:

在将数千个项目从 String 转换为 int 的循环中,应该在调用 Integer.parseInt 之前检查一个字符串是否为空,还是应该直接依赖 NumberFormatException 移动到下一个?

【问题讨论】:

  • 如果您知道您的字符串将是要么为空或有效,然后检查它是否为空。如果您的字符串可能在其他方面无效,则您可能无论如何都必须捕获NumberFormatException
  • 这取决于空字符串与非空字符串的比率,但我认为测试必须非常高才能使您的代码比单独处理异常更有效。
  • 这太多余了。捕捉更有效。
  • 如果你的字符串可以为null、空或有字母,最好捕获NumberFormatException。
  • 你应该做最清楚的事情。恕我直言,应为异常情况保留异常,如果是常见情况,请检查它。

标签: java


【解决方案1】:

如果空字符串是您的数据中的异常(即它应该发生),那么不检查它们并让异常系统处理它是公认的做法。

如果空字符串是可能的(即使很少见)并且意味着某些东西(例如"" -> "0"),那么您应该检查。

底线是您不应使用异常来控制程序流程

【讨论】:

  • "底线是你不应该使用异常来控制程序流。"嗯,我倾向于将parseInt 等人视为一种特殊情况。没有你可以先调用的函数(例如willParse),所以为了避免抛出异常,你必须自己进行一些检查——逻辑并不像人们想象的那么简单。我倾向于认为捕获异常更容易。 This question 对此进行了一些有趣的讨论。
  • @Michael - Integer.parseInt 长期以来一直是个问题。很多地方都讨论过。正如 OP 所说,我希望只关注这里的空字符串。
【解决方案2】:

没有。

无论如何,您都必须抓住NumberFormatException,因此添加额外的检查只会添加更多的代码,读者必须费力地阅读,而不会带来任何功能上的好处。

(我假设您确实要检查它是否在任何情况下都无效,而不仅仅是检查它是否为空。如果您只想检查它是否为空而不是是否它通常是无效的,那么显然只需使用isEmpty() 并且根本不会捕获任何东西!)

是的,异常通常不应用于控制流 - 但捕获 NumberFormatException 以检查字符串是否为有效的 int 是对该规则的合理理解的异常。

【讨论】:

  • 这真的取决于用例/要求(PS。我不是那个投反对票的人)。
  • @JaroslawPawlak 我没有看到需要额外检查以查看它是否为空的用例,如果您无论如何都必须捕获异常(可能会有一些奇怪的性能案例,在这种情况下答案是“基准测试”。)
  • 同意。 Jon Skeet 本人doesn't seem to have a problem with it。这是一个不幸设计的 API,真的(我希望有一个兄弟方法来验证字符串是否有效),但它是完全地道的 Java。
  • @Michael 同意,在理想的世界中,isParseable() 上会有一个 isParseable() 方法,我们会使用类似的方法来代替 - 但没有,所以这是唯一合理的方法。
【解决方案3】:

好吧,这一切都取决于:

  1. 如果源集合中的每个字符串在解析时都应该是一个有效的整数,那么我会说不要检查它是否不为空,因为它可能最终会隐藏一个错误。
  2. 如果您希望某些字符串为空而其他字符串为有效整数,那么是的,您需要在解析为整数之前检查它是否不为空,否则您将收到异常。
  3. 如果源集合既可以包含有效整数,也可以包含无法解析为整数的字符串,那么您需要在解析字符串之前执行一些验证。

【讨论】:

    猜你喜欢
    • 2014-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 2014-09-22
    • 1970-01-01
    相关资源
    最近更新 更多