java有一个不会为坏数据抛出异常的int.tryparse吗?

cod*_*ing 101 java

可能重复:
Java:封装Integer.parseInt()的好方法
如何将字符串转换为float并避免在java中使用try/catch?

C#有Int.TryParse:Int32.TryParse方法(String,Int32%)

这种方法的优点在于它不会为坏数据抛出异常.

在java中,Integer.parseInt("abc")将抛出异常,并且在可能发生这种情况的情况下,很多性能将受到影响.

对于那些性能问题的情况,有没有办法解决这个问题?

我能想到的另一种方法是针对正则表达式运行输入,但我必须测试以查看更快的内容.

Woo*_*Moo 58

不,你必须这样做:

boolean tryParseInt(String value) {  
     try {  
         Integer.parseInt(value);  
         return true;  
      } catch (NumberFormatException e) {  
         return false;  
      }  
}
Run Code Online (Sandbox Code Playgroud)

......你可以像这样使用它:

if (tryParseInt(input)) {  
   Integer.parseInt(input);  // We now know that it's safe to parse
}
Run Code Online (Sandbox Code Playgroud)

  • 所以现在我们不仅增加了抛出和捕获异常的开销,而且我们还执行了两次实际的解析? (124认同)
  • 请注意MSDN版本如何返回整数. (41认同)
  • 这不会返回已解析的整数.他们会怎么做? (8认同)
  • 您可以使用它作为一种方法来确定解析int是否安全.请注意MSDN版本如何返回布尔值. (3认同)
  • C#中的TryParse方法使用"out"参数(本质上是指针)来设置解析成功的目标数字变量,其成功由方法的布尔返回值指示.Java没有与out参数等效的东西,因此需要在这个答案中显示if逻辑.https://msdn.microsoft.com/en-us/library/f02979c7(v=vs.110).aspx (2认同)
  • 或者使用默认值...因为,如果我们不希望异常来解决问题,那么通常我们就会以这种方式结束。`tryParseInt(String value, int defaultValue)`。请参阅 Java 8 的 `Map.getOrDefault(...)` (2认同)

Gra*_*and 28

Apache Commons有一个IntegerValidator类,看起来可以做你想要的.Java没有为此提供内置方法.


Jim*_*ley 2

编辑- 刚刚看到您关于与潜在错误的输入数据相关的性能问题的评论。我不知道 parseInt 上的 try/catch 与正则表达式相比如何。我猜测,基于很少的硬知识,与 Java 中的 try/catch 相比,正则表达式的性能并不高。

无论如何,我只想这样做:

public Integer tryParse(Object obj) {
  Integer retVal;
  try {
    retVal = Integer.parseInt((String) obj);
  } catch (NumberFormatException nfe) {
    retVal = 0; // or null if that is your preference
  }
  return retVal;
}
Run Code Online (Sandbox Code Playgroud)

  • 这很糟糕,0 是可接受的返回值,因此不可能推断出异常或有效条目。 (42认同)
  • 异常非常慢,因为它们展开堆栈并查找任何finally 块。验证时应避免异常。他们的作用是报告严重问题,即例外情况应该是例外。 (4认同)
  • 我认为返回 null 是最好的方法,因为这更类似于实现返回布尔值的“TryParse”的请求问题。为了解决异常,“Integer.parseInt”实现可以镜像为返回 null,而不是抛出“NumberFormatException”。 (3认同)
  • 另外,retVal 完全没用...... (3认同)
  • 投反对票。0 是有效整数 (2认同)
  • @Woot4Moo *0 是可接受的返回值*...取决于。取决于问题域。 (2认同)