什么是预期的时候处理NumberFormatException的正确方法是什么?
我遇到这种情况,我需要将a解析String
为an
int
,但我不知道该如何处理NumberFormatException
。当我没有抓住它时,编译器不会抱怨,但是我只是想确保自己能够正确处理这种情况。
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;
}
我希望0
当当前片段不是数字或无法解析时返回此方法。当我没有NumberFormatException
显式捕获时,是否不分配变量i
?还是有一些默认值Integer.parseInt()
返回?
一般风格表示,如果我捕获到异常,则应将其记录在某处。我不想记录它。有时会抛出此异常是正常的操作,这对我来说也不好。我找不到函数,但是会告诉我是否Integer.parseInt()
会引发异常。因此,我唯一的行动方针似乎就是调用它并捕获异常。
该javadoc的为parseInt
没有太大帮助。
以下是我想知道的具体问题:
- 有没有可以调用的方法,该方法可以告诉我是否在调用前
Integer.parseInt()
抛出一个NumberFormatException
?这样我就可以毫无问题地记录日志了,因为它永远都不会发生。 - 如果我根本不捕获异常,是否不会分配变量?然后,当它不是数字时,我将简单地将其初始化为所需的值,并且不会捕获异常。
- 有没有办法以某种方式明确标记我不关心的异常?我认为这将类似于
AWTEvent.consume()
。如果是这样,那么我将这样做,以便Google CodePro不会将其视为“未记录”。
回答:
- 有没有可以调用的方法,该方法可以告诉我Integer.parseInt()在调用之前是否抛出NumberFormatException?这样我就可以毫无问题地记录日志了,因为它永远都不会发生。
可悲的是没有。至少不在核心Java API中。但是,编写一个很容易-只需修改下面的代码即可。
- 如果我根本不捕获异常,是否不会分配变量?然后,当它不是数字时,我将简单地将其初始化为所需的值,并且不会捕获异常。
如果未捕获异常,则堆栈将展开,直到它到达将对其进行处理的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;
}
}
以上是 什么是预期的时候处理NumberFormatException的正确方法是什么? 的全部内容, 来源链接: utcz.com/qa/410103.html