我遇到了使用多捕获块的问题,异常可以应用于同一事件。请看下面的代码:
for (String currentString : stringsList) {
try {
Long.valueOf(currentString);
} catch (NullPointerException e) {
//do smth;
continue;
} catch (NumberFormatException e) {
//do smth;
continue;
}
//do smth;
}
想法如下:如果当前字符串变量为null
,则执行特定操作并完成当前迭代而不检查NumberFormatException
。但无论如何,当currentString == null
下一个捕获区块完成时,它就会失效。我无法理解为什么continue
在这种情况下不起作用并且没有留下第一个catch-block。下一个解决方案是不可接受的,因为它不会让代码保持在循环中:
for (String currentString : stringsList) {
try {
Long.valueOf(currentString);
} catch (NullPointerException e) {
//do smth;
break;
} catch (NumberFormatException e) {
//do smth;
} finally {
continue;
}
//do smth;
}
我找到了解决方案但不优雅:
for (String currentString : stringsList) {
if (currentString == null) {
//do smth;
continue;
}
try {
Long.valueOf(currentString);
} catch (NumberFormatException e) {
//do smth;
continue;
}
//do smth;
}
如果有人知道如何解决它,我真的很感激你的建议。提前谢谢。
更新 真的很抱歉,但这是我的错。 Long.valueOf(null)也会抛出NumberFormatException。感谢所有的评论。我目前的解决方案是:
for (String currentString : stringsList) {
try {
Long.valueOf(currentString);
} catch (NumberFormatException e) {
if (currentString != null) {
//do smth;
}
continue;
}
//do smth;
}
答案 0 :(得分:2)
Long.valueOf不会抛出NullPointerException。
在Long源代码中,您将看到valueOf方法调用parseLong方法。
此方法检查null并抛出NumberFormatException(请参阅下面的代码段)
public static long parseLong(String s, int radix)
throws NumberFormatException
{
if (s == null) {
throw new NumberFormatException("null");
}
所以你必须这样做
if (currentString == null) {
//do smth;
continue;
}
答案 1 :(得分:1)
巴迪,你的解释不是很清楚,但看着你的#34;不那么优雅"例如,您可以拥有以下内容 如果所有的" //做了smth;"代码是相同的,然后有一个共同的方法,否则单独使用它,但尝试将所有常见代码保存在一个地方。你不应该有重复的代码 如果这些代码片段可以从其他类重用,那么创建一个实用程序类并将其作为公共方法。
考虑所有//do smth;
不同
private void yourMethod(){
for (String currentString : stringsList) {
if (currentString == null) {
//do smth;
} else{
try {
Long.valueOf(currentString);
} catch (NumberFormatException e) {
//do smth;
continue;
}
//do smth;
}
}
}
考虑您的所有//do smth;
相同
private void yourMethod(){
for (String currentString : stringsList) {
if (currentString == null) {
doSomething();
} else{
try {
Long.valueOf(currentString);
} catch (NumberFormatException e) {
//Error handling...
} finally{
doSomething();
}
}
}
}
private void doSomething(){
//do smth;
}