在预期时,处理NumberFormatException的正确方法是什么?

我遇到了这种情况,我需要将a解析为一个,我不知道如何处理.当我没有抓住它时,编译器不会抱怨,但我只想确保我正确地处理这种情况。StringintNumberFormatException

private int getCurrentPieceAsInt() {
    int i = 0;
    try {
        i = Integer.parseInt(this.getCurrentPiece());
    } catch (NumberFormatException e) {
        i = 0;
    }
    return i;
}

我想像这样简化我的代码。编译器没有问题,但线程在 .NumberFormatException

private int getCurrentPieceAsInt() {
    int i = 0;
    i = Integer.parseInt(this.getCurrentPiece());
    return i;
}

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

private int getCurrentPieceAsInt() {
    int i = 0;
    try {
        i = Integer.parseInt(this.getCurrentPiece());
    } catch (NumberFormatException e) {
        i = 0;
        e.printStackTrace();
    }
    return i;
}

我希望此方法在当前片段不是数字或无法解析时返回。当我没有显式捕获时,它不会分配变量吗?还是返回了某个默认值?0NumberFormatExceptioniInteger.parseInt()

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

javadoc 没有多大帮助。parseInt

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

  • 有没有一个我可以调用的方法,它会告诉我是否会在调用它之前抛出一个?然后我就不会有问题记录这个,因为它不应该发生。Integer.parseInt()NumberFormatException
  • 如果我根本没有抓住异常,valiable不会被分配?然后,我将简单地将其初始化为我想要的值,当它不是数字并且不捕获异常时。
  • 有没有办法以某种方式明确地标记我不关心它的异常?我想这将是类似于.如果是这样,那么我将这样做,以便Google CodePro不会将其视为“未记录”。AWTEvent.consume()

答案 1
  • 有没有一个我可以调用的方法,可以告诉我Integer.parseInt()是否会在调用它之前抛出一个NumberFormatException?然后我就不会有问题记录这个,因为它不应该发生。

可悲的是,没有。至少在核心Java API中不是这样。但是,编写一个很容易 - 只需修改下面的代码即可。

  • 如果我根本没有抓住异常,valiable不会被分配?然后,我将简单地将其初始化为我想要的值,当它不是数字并且不捕获异常时。

如果不捕获异常,则堆栈将展开,直到它击中将处理它的 catch 块,或者它将完全展开并停止线程。实际上,变量不会被分配,但这并不是你想要的。

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

可能有一种方法可以告诉 CodePro 忽略此特定警告。当然,使用FindBugs和Checkstyle等工具,您可以在特定位置关闭警告。(编辑:@Andy已经指出了如何做到这一点。

我怀疑你想要的是像@daveb提到的Commons lang包。编写这样的函数非常容易:

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;
    }
}

答案 2

在commons lang中有NumberUtils.toInt(String,int),它将完全按照你的意愿去做。

NumberUtils.toInt("123", 42) ==> 123
NumberUtils.toInt("abc", 42) ==> 42