多个catch块并继续运算符

时间:2015-06-03 10:55:55

标签: java

我遇到了使用多捕获块的问题,异常可以应用于同一事件。请看下面的代码:

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

2 个答案:

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