【问题标题】:Not able to use Multi Catch from Java Effectively [duplicate]无法有效地使用 Java 中的 Multi Catch [重复]
【发布时间】:2015-11-27 11:56:12
【问题描述】:

我真的很想使用 Java-1.7 的功能。此功能之一是“多捕获”。目前我有以下代码

try {
    int Id = Integer.parseInt(idstr);

    TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));

    updateTotalCount(tempTypeInfo);
} catch (NumberFormatException numExcp) {
    numExcp.printStackTrace();
} catch (Exception exception) {
    exception.printStackTrace();
} 

我想从上面的代码中删除两个 catch 块,而是使用如下的单个 catch:

try {
    int Id = Integer.parseInt(idstr);

    TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));

    updateTotalCount(tempTypeInfo);
} catch (Exception | NumberFormatException ex) { // --> compile time error
    ex.printStackTrace();
} 

但是上面的代码给出了编译时错误:

"NumberFormatException" 已被替代方法捕获 例外。

我理解上面的编译时错误,但是我的第一个代码块的替换是什么。

【问题讨论】:

    标签: java exception try-catch numberformatexception multi-catch


    【解决方案1】:

    NumberFormatExceptionException 的子类。说两个catch 块应该具有相同的行为就像说您对NumberFormatException 没有任何特殊处理,只是对Exception 具有相同的一般处理。在这种情况下,你可以省略它的 catch 块并且只省略 catch Exception

    try {
        int Id = Integer.parseInt(idstr);
    
        TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));
    
        updateTotalCount(tempTypeInfo);
    } catch (Exception exception) {
        exception.printStackTrace();
    } 
    

    【讨论】:

      【解决方案2】:

      在这种情况下不需要多重捕获,因为NumberFormatException 派生自Exception。你可以简单地只捕获Exception 来获取它们。如果您需要对NumberFormatException 进行其他处理而不是其他异常处理,则必须使用您首先发布的示例。

      【讨论】:

        【解决方案3】:

        你可以使用

            try {
            int Id = Integer.parseInt(idstr);
        
            TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));
        
            updateTotalCount(tempTypeInfo);
          } catch (Exception exception) {
            exception.printStackTrace();
          } 
        

        【讨论】:

        • 感谢@Am_I_Helpful 的编辑。本着您所做编辑的精神,You_are_helpful :)
        • 感谢您用“You_are_helpful”感谢我!再次感谢。还有一个 +1
        【解决方案4】:

        multi-catch 中的类型必须是不相交的,java.lang.NumberFormatExceptionjava.lang.Exception 的子类。

        【讨论】:

          【解决方案5】:

          编译器告诉你

          } catch (Exception ex) {
          

          还将捕获NumberFormatException 异常,因为java.lang.NumberFormatException 扩展了java.lang.IllegalArgumentException,它扩展了java.lang.RuntimeException,最终扩展了java.lang.Exception

          【讨论】:

            【解决方案6】:

            Exception 是所有异常的父类,理想情况下(首选方法 - 最佳编码实践),除非您不确定运行时 try 块中会抛出什么,否则您永远不应该捕获 Exception

            由于在您的代码中您正在执行 NumberFormat 操作,它是 Exception 的子类,因此您不应捕获 Exception(除非其他 2 种方法可能会抛出未经检查的异常),而是使用:

            try {
                int Id = Integer.parseInt(idstr);
                TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));\
                updateTotalCount(tempTypeInfo);
            } catch (NumberFormatException npe) {
                npe.printStackTrace();
            } 
            

            【讨论】:

            • 谢谢@stategroup,我知道异常是超类,但在运行时我不知道其他类型的异常,这就是为什么我的代码有 NumberFormatexception(expected) 和 excetpion(unexpected) .
            • @M.S.Naidu,为确保您的代码不会抛出任何其他异常,您可以检查您正在调用的其他方法。如果您没有进行任何 IO 操作、类转换等(可能会引发 RunTime 异常),那么您不需要捕获 Exception。 Java具有不同异常级别的原因是您可以很好地控制您的代码。这样,您可以捕获异常并选择忽略它或重新抛出它
            【解决方案7】:

            添加到 Mureinik 的解决方案:

            如果您想区分每个子类的错误处理,您可以在 catch 块中使用 instanceof,如下所示:

            FileNotFoundException is subclass of IOException
            
            catch (IOException e) {
                        if (e instanceof FileNotFoundException)
                        {
                            System.out.println("FileNotFoundException");
                        }
                        else if(e instanceof IOException)
                        {
                            System.out.println("IOException");
                        }
            
                    }
            

            【讨论】:

            • 您可以直接使用多个catch 块按照特定到一般的顺序捕获不同类型的异常,而不是为每种类型的异常使用instanceof
            猜你喜欢
            • 2016-09-30
            • 1970-01-01
            • 2023-01-25
            • 1970-01-01
            • 1970-01-01
            • 2013-07-07
            • 2015-09-07
            • 1970-01-01
            • 2011-02-09
            相关资源
            最近更新 更多