Does java have a int.tryparse that doesn't throw an exception for bad data?
Possible Duplicate:
Java: Good way to encapsulate Integer.parseInt()
how to convert a string to float and avoid using try/catch in java?
C具有int.typarse:int32.typarse方法(string,int32%)
这个方法的好处在于它不会对坏数据抛出异常。
在爪哇,EDCOX1(0)将抛出一个异常,在这种情况下,很多性能会受到影响。
对于那些性能是一个问题的情况,是否有办法解决这个问题?
我唯一能想到的另一种方法是对一个regex运行输入,但是我必须进行测试,看看有什么更快。
- 我认为抛出异常不会降低性能。Regex肯定会慢一些。
- 不幸的是,没有。请参阅这个问题了解更多详细信息:stackoverflow.com/questions/1369077/…
- @martijncoteaux:"抛出异常不会降低性能":false。Regex肯定会慢一点:是的。
- stackoverflow.com/a/1486082/393908
- @Martijn:抛出大量异常肯定会对性能造成不良影响(尽管我很难想出一个用例,在这个用例中,您必须解析大量数据,其中很大一部分数据的格式不正确)。
- @脱衣武士其实你是错的。抛出异常并不昂贵,构建堆栈跟踪是。
- "在现代JVM中,如果不打印堆栈跟踪,则引发异常的性能损失非常小。"这是一个合理的声明/
- @Woot4Moo:这个答案表明它比只做一个循环慢大约66倍,而不打印堆栈跟踪。考虑到实际解析字符串的成本,这可能不会慢得多,但这也不是什么值得嘲笑的事情。stackoverflow.com/a/299315/120955
- 我知道这不是复制品。该问题明确说明了对bool int.TryParse(out string)的请求,其中没有实现,但可以实现。
不,你必须这样做:
…您可以这样使用它:
1 2 3
| if (tryParseInt (input )) {
Integer. parseInt(input ); // We now know that it's safe to parse
} |
- 这不会返回已分析的整数。他们会怎么做?
- 您可以使用它作为一个方法来确定解析int是否安全。请注意,msdn版本如何也返回一个布尔值。
- 请注意,msdn版本如何还返回整数。
- AshBurlaczenko,这是Java,我用它作为一个模拟。
- 所以现在我们不仅增加了抛出和捕获异常的开销,而且还执行了两次实际的解析?
- 对于输入验证,这仍然是有意义的。如果你传递了一个应该是int的字符串,那么这就很好了。尤其是当您将它与guava的:preconditions.checkArgument(integer.typarse(par))一起使用时,"希望par是int,但却是"+par)
- @脱衣武士:我同意…如果您要解析整数,那么您也可以将它留给EDOCX1的调用方(4),以便在不需要时放弃结果。
- 您总是可以使用肮脏的hack,使用atomicboolean包装类的对象作为成功输出参数,并返回实际整数(或者,失败时返回默认值)。
- 如果分析成功,c中的typarse方法使用"out"参数(本质上是指针)来设置目标数字变量,其成功由方法的布尔返回值指示。Java没有等效于out参数,因此需要在这个答案中显示的IF逻辑。msdn.microsoft.com/en-us/library/f02979c7(v=vs.110).aspx
- 或者使用默认值…既然,如果我们不想有例外来解决这个问题,那通常就是我们最终会遇到的问题。tryParseInt(String value, int defaultValue)。参见Java 8的EDCOX1 OR 6
ApacheCommons有一个integervalidator类,它似乎可以满足您的需要。Java提供了不内置的方法来执行此操作。
编辑——刚刚看到了您对与一个可能不好的输入数据相关联的性能问题的评论。我不知道parseint上的try/catch与regex相比有什么不同。我想,基于很少的硬知识,与Java中的Test/catch相比,正则表达式的性能不是很好。
不管怎样,我只想这样做:
- 这很糟糕,0是可接受的返回值,因此无法推断异常或有效条目。
- 由于您想要返回整数(而不是int),所以可以使用new Integer(String)构造函数。
- 异常非常慢,因为它们会展开堆栈并查找任何finally块。应避免例外情况进行验证。它们是用来报告严重问题的,即例外情况应该是例外的。
- 不过,使用为函数提供的默认值参数来实现这一点可能很有用。
- 我认为返回空值是最好的方法,因为这与实现返回布尔值的TryParse的请求问题更为相似。为了避开异常,可以镜像Integer.parseInt实现以返回空值,而不是抛出NumberFormatException。
- 而且,重新评估是完全无用的…
- 投票否决。0是有效整数