首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在预期的情况下处理NumberFormatException的正确方法是什么?

在预期的情况下处理NumberFormatException的正确方法是什么?
EN

Stack Overflow用户
提问于 2010-12-10 23:01:37
回答 8查看 81.3K关注 0票数 19

我遇到了这样的情况,我需要将String解析为int,而我不知道如何处理NumberFormatException。当我没有捕捉到它时,编译器不会抱怨,但我只想确保我正确地处理了这种情况。

代码语言:javascript
复制
private int getCurrentPieceAsInt() {
    int i = 0;
    try {
        i = Integer.parseInt(this.getCurrentPiece());
    } catch (NumberFormatException e) {
        i = 0;
    }
    return i;
}

我只想像这样简化我的代码。编译器对它没有问题,但是线程在NumberFormatException上死了。

代码语言:javascript
复制
private int getCurrentPieceAsInt() {
    int i = 0;
    i = Integer.parseInt(this.getCurrentPiece());
    return i;
}

谷歌CodePro希望我以某种方式记录异常,我同意这是最佳实践。

代码语言:javascript
复制
private int getCurrentPieceAsInt() {
    int i = 0;
    try {
        i = Integer.parseInt(this.getCurrentPiece());
    } catch (NumberFormatException e) {
        i = 0;
        e.printStackTrace();
    }
    return i;
}

当当前片段不是数字或无法解析时,我希望此方法返回0。当我没有显式捕获NumberFormatException时,它是不是没有分配变量i?或者,Integer.parseInt()是否返回了一些默认值?

通用风格说,如果我捕捉到一个异常,我应该将它记录在某个地方。我不想记录下来。有时抛出这个异常是正常的操作,这对我来说也不太合适。但是,我找不到一个函数,它会告诉我Integer.parseInt()是否会抛出异常。因此,我唯一的行动方案似乎就是调用它并捕获异常。

用于parseIntjavadoc帮助不大。

以下是我想知道的具体问题:

  • 有没有一个我可以调用的方法,可以告诉我Integer.parseInt()在调用之前是否会抛出一个NumberFormatException
  • 如果我只是没有捕捉到异常,那么valiable是否会被赋值?然后,当它不是数字时,我会简单地将它初始化为我想要的值,而不是捕获exception.
  • Is,一种以某种方式明确标记异常的方法,我并不关心它。我认为这应该是类似于AWTEvent.consume()的东西。如果是,那么我将这样做,这样谷歌CodePro就不会将其视为“未记录”。
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-12-10 23:19:46

  • 有没有一个我可以调用的方法,可以告诉我Integer.parseInt()在调用之前是否会抛出一个NumberFormatException?这样我就不会有任何问题了,因为它永远不会发生。

遗憾的是,没有。至少在核心Java API中没有。然而,编写一个很容易-只需修改以下代码即可。

  • 如果我只是没有捕捉到异常,那么valiable会不会被赋值?然后,当它不是数字时,我将简单地将它初始化为我想要的值,并且不捕获异常。

如果你没有捕捉到异常,那么堆栈将会展开,直到它遇到一个将处理它的catch块,或者它将完全展开并停止线程。变量实际上不会被赋值,但这并不是您想要的。

  • 有没有办法以某种方式明确地将异常标记为我不关心它?我认为这应该是类似于AWTEvent.consume()的东西。如果是,那么我将这样做,这样谷歌CodePro就不会将其视为“未记录”。

也许有一种方法可以告诉CodePro忽略这个特定的警告。当然,使用像FindBugs和Checkstyle这样的工具,你可以关闭特定位置的警告。(编辑:@Andy指出了如何做到这一点。)

我怀疑您想要的是@daveb提到的Commons lang包。编写这样的函数非常简单:

代码语言:javascript
复制
int parseWithDefault(String s, int def) {
    try {
        return Integer.parseInt(s);
    }
    catch (NumberFormatException e) {
        // It's OK to ignore "e" here because returning a default value is the documented behaviour on invalid input.
        return def;
    }
}
票数 13
EN

Stack Overflow用户

发布于 2010-12-10 23:07:33

commons lang中有一个NumberUtils.toInt(String, int),它可以做你想要做的事情。

代码语言:javascript
复制
NumberUtils.toInt("123", 42) ==> 123
NumberUtils.toInt("abc", 42) ==> 42
票数 10
EN

Stack Overflow用户

发布于 2010-12-10 23:25:21

代码语言:javascript
复制
* Is there a way to mark the exception somehow explicitly that I don't care about it? I'm thinking this would be something similar to AWTEvent.consume(). If so, then I will do this so that Google CodePro doesn't see this as "unlogged".

可以,您可以在本地禁用一行代码的CodePro审计规则:

http://code.google.com/javadevtools/codepro/doc/features/audit/locally_disabling_audit_rules.html

也就是说,不一定要在每个异常捕获块中包含诊断日志记录。有时,最好的做法是选择默认课程。有时,它是为了与用户交互。那得看情况。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4410107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档