Java 超类型和子类型异常处理
考虑以下代码:Java 超类型和子类型异常处理,java,exception,exception-handling,Java,Exception,Exception Handling,考虑以下代码: 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
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
}
}
}
我怀疑编译错误是在第二次捕获时生成的,因为它已经被超级类型异常处理过了。但为什么当第二个catch块到达第一个位置并且第一个到达第二个位置时(如下所示),编译错误不会出现呢
然后,第一个块(即算术异常)也将在到达catch(异常e)之前处理异常
已修改
现在我在catch(异常e)之前添加所有未检查的异常
现在,所有未检查的异常都在到达catch(异常e)之前得到处理。那么,除了这些异常之外,是否还有其他未检查的异常,因为没有生成编译错误?还是其他原因?更具体的异常-
算术异常
,应该放在第一位,因为它允许您以不同于异常
的一般处理方式来处理它
如果先放置异常处理程序或
异常
,则会使处理程序成为算术异常
死代码,因为它永远无法到达-任何算术异常
都将被异常
的处理程序捕获更具体的异常-算术异常
-应该放在第一位,因为它允许您以与异常
的一般处理不同的方式处理它
如果首先放置异常处理程序或
异常
,则会使算术异常
的处理程序成为死代码,因为它永远无法到达-任何算术异常
都会被Java中异常的处理程序捕获,捕捉块将按它们在源文件中的显示顺序触发
因此,如果更一般的异常
首先出现,则在抛出算术异常
且第二个catch块不可访问时也会触发该异常
另一方面,如果更具体的算术异常
的catch块首先出现,那么异常
的catch块就不会变得不可访问,因为有异常
的子类没有被第一个块捕获,捕捉块将按它们在源文件中的显示顺序触发
因此,如果更一般的异常
首先出现,则在抛出算术异常
且第二个catch块不可访问时也会触发该异常
另一方面,如果更具体的算术异常
的catch块首先出现,则异常
的catch块不会变得不可访问,因为有异常
的子类未被第一个块捕获。因为除了算术异常
之外,还有未选中的异常
s。try块内的逻辑不需要第二个catch块。控件只有在抛出算术异常以外的异常时才会转到第二个catch块(异常)。因此,您仍然可以编写第二个catch块,这根本不会引起任何问题。@MarkoTopolnik如果我在最后一个块之前添加所有未检查的异常,会怎么样?它会是一样的吗?我添加了一些代码。请看上面。这不会发生,因为您不知道在运行时可能会抛出哪些未检查的异常。编译时和运行时类路径完全不同,异常类也可以动态生成。因为除了算术异常
之外,还有未选中的异常
。对于try块中的逻辑,不需要第二个catch块。控件只有在抛出算术异常以外的异常时才会转到第二个catch块(异常)。因此,您仍然可以编写第二个catch块,这根本不会引起任何问题。@MarkoTopolnik如果我在最后一个块之前添加所有未检查的异常,会怎么样?它会是一样的吗?我添加了一些代码。请看上面。这不会发生,因为您不知道在运行时可能会抛出哪些未检查的异常。编译时类路径和运行时类路径完全不同,异常类也可以动态生成。
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");
}
}
}
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");
}
}
}