【发布时间】:2011-05-23 13:05:54
【问题描述】:
我遇到了这种情况,我需要将String 解析为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() 是否会引发异常。所以我唯一的做法似乎就是调用它并捕获异常。
parseInt 的 javadoc 没有多大帮助。
以下是我想知道的具体问题:
- 是否有我可以调用的方法来告诉我
Integer.parseInt()是否会在调用之前抛出NumberFormatException?那么我就可以毫无问题地记录它,因为它永远不会发生。 - 如果我根本没有捕获异常,是否不会分配变量?然后我会简单地将它初始化为我想要的值,当它不是数字并且不捕获异常时。
- 有没有办法以某种方式明确地标记我不关心的异常?我认为这类似于
AWTEvent.consume()。如果是这样,那么我会这样做,以便 Google CodePro 不会将其视为“未记录”。
【问题讨论】:
-
“如果我根本不捕获异常,变量不会被分配吗?那么我就不会捕获异常。” - 如果您不确定这是否是一个可行的选择,我建议您尝试(并使用调试器进行演练)以 100% 确定您了解在这种情况下会发生什么。我的意思并不是说我在低声说话,但我觉得对异常有深刻的理解很重要。
-
我不是 Java 程序员,但在 C# 中,Integer 有一个 TryParse() 方法,它尝试解析 int 并返回一个布尔值是否成功。当然,这比期待一个例外要好。
-
如果有
tryParse()方法我会喜欢的。我想我理解为什么没有一个,因为它基本上意味着做两次工作。另外,当我尝试它时,未被捕获的NumberFormatException会当场杀死线程。我更新了问题以反映这一点。
标签: java exception try-catch numberformatexception