java - 父类(super class)型和子类型异常处理

标签 java exception

考虑这段代码:

public class CheckException 
{
    public static void main(String [] args)
    {       
       int a = 10;
        try{
            int c = a/0;
        } catch(Exception e){

        } catch(ArithmeticException e1){    \\ compilation error

        }
    }   
}

我怀疑编译错误是在第二次捕获时产生的,因为它已经被父类(super class)型异常处理了。但是为什么当第二个 catch block 到达第一个位置并且第一个到达第二个位置时(如下所示)不会出现编译错误?

public class CheckException {

public static void main(String [] args){

    int a = 10;
    try{
        int c = a/0;
    } catch(ArithmeticException e){
//       System.out.println("1");   
    } 
    catch(Exception e1){
//          System.out.println("2");
    }
}

}

然后第一个 block (即 ArithmeticException)也将在到达 catch(异常 e)之前处理异常。

已修改

现在我在 catch(Exception e) 之前添加所有未检查的异常。

public class CheckException {

public static void main(String [] args){

    int a = 10;
    try{
        int c = a/0;
    } catch(ArithmeticException e){
     System.out.println("1");   
    } 
    catch(ArrayIndexOutOfBoundsException e1){
        System.out.println("2");
    }
    catch(ClassCastException  e1){
        System.out.println("2");
    }
    catch(IllegalArgumentException  e1){
        System.out.println("2");
    }
    catch(IllegalStateException  e1){
        System.out.println("2");
    }
    catch(NullPointerException  e1){
        System.out.println("2");
    }
    catch(AssertionError e1){
        System.out.println("2");
    }
    catch(ExceptionInInitializerError  e1){
        System.out.println("2");
    }
    catch(StackOverflowError  e1){
        System.out.println("2");
    }
    catch(NoClassDefFoundError  e1){
        System.out.println("2");
    }
    catch(ArrayStoreException e1){
        System.out.println("2");
    }
    catch(IllegalMonitorStateException e1){
        System.out.println("2");
    }
    catch(IndexOutOfBoundsException e1){
        System.out.println("2");
    }
    catch(NegativeArraySizeException e1){
        System.out.println("2");
    }
    catch(SecurityException e1){
        System.out.println("2");
    }
    catch(UnsupportedOperationException e1){
        System.out.println("2");
    }
    catch(Exception e1){
        System.out.println("2");
    }
}

}

现在,所有未经检查的异常都在到达 catch(Exception e) 之前得到处理。那么,除了这些未产生编译错误之外,是否还有未检查的异常?还是其他原因?

最佳答案

在 Java 中,catch block 按照它们在源文件中出现的顺序触发。

因此,如果更一般的 Exception 先出现,如果抛出 ArithmeticException 并且无法访问第二个 catch block ,它也会触发。

另一方面,如果更具体的 ArithmeticException 的 catch block 先出现,那么 Exception 的 catch block 不会变得不可访问,因为有子类未被第一个 block 捕获的 Exception

关于java - 父类(super class)型和子类型异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27247531/

相关文章:

java.lang.ClassNotFoundException : org. glassfish.jersey.internal.RuntimeDelegateImpl ,抛出 BadRequestException 时

java - Play Framework - 为 Assets 定义 404 页面

java - Intellij tomcat 本地运行配置——幕后发生了什么?

java - Gson:bean 中的枚举序列化问题

java - 是否有机会在我的项目中使用 Class <?, ?> ?

使用调用堆栈进行 C++ Visual Studio 调试

Java Swing 或 SWT : easy way to build a desktop UI "wizard" -- suggestions?

java - 将 arraylist 存入数组时出现异常

c++ - C++错误代码vs ASSERTS vs Exceptions选项options :( [closed]

java - 在多线程应用程序中使用共享的 Weka 分类器导致异常