1

给定一段java代码:

class SampleExpcetion {
  public static void main(String args[]){
        try {
                 int a[]= new int[15];
                 a[5]= 30/0;
         } 
         catch(Exception e) {System.out.println("task completed");}  
         catch(ArithmeticException e) {System.out.println("task1 completed");}  
         catch(ArrayIndexOutOfBoundsException e) { System.out.println("task2 completed");}

         System.out.println("Rest of the code......");
   }
}  

为什么这段代码会给出编译时错误?

4

7 回答 7

2

第一个 catch 块捕获所有异常,因此永远无法到达其他异常。

于 2013-02-06T08:21:23.710 回答
2

因为catch(Exception e) {System.out.println("task completed");}会捕获所有异常。

 catch(ArithmeticException e) {System.out.println("task1 completed");}  
 catch(ArrayIndexOutOfBoundsException e) { System.out.println("task2 completed");}

是死代码。

像这样重新排序,甚至更好地消除:catch(Exception e)

  catch(ArithmeticException e) {System.out.println("task1 completed");}  
  catch(ArrayIndexOutOfBoundsException e) { System.out.println("task2 completed");}
  catch(Exception e) {System.out.println("task completed");}  
于 2013-02-06T08:21:26.760 回答
1

因为“Exception e”能够捕获所有异常对象,因此其他的catch块将无法到达。这被称为“无法到达的代码”。无法访问的代码是 Java 语言中的错误。

例如:-如果 Clothes 是一个异常类并且有子类-> Shirt 和 Trouser。如果 Shirt 类的异常发生了,但是我们在 Shirt 之前用 Clothes 捕获了它,那么它永远不会到达下一个带有 Shirt Exception 的 catch 块,因为它已经被处理了。这会导致下一个 catch 块无法访问。

希望能帮助到你!!!

于 2014-05-28T10:32:54.577 回答
1

在一个try catch块中,所有后续的 catch 块都不应该在 catch 块中有任何子类异常。这将导致死代码。

另外要补充的是,在 SE 7 中,您可以指定要检查的所有异常类型,例如:

catch (IOException|SQLException ex) {
    //...
}

您是否想了解什么是NullPointerException

于 2013-02-06T08:30:07.607 回答
1

编译器发现在它的超类ArithmeticException 之后捕获一个是不可能的;第一个 catch 子句将始终匹配。

于 2013-02-06T08:20:52.547 回答
0

Exceptionclass 是ArithmeticExceptionandArrayIndexOutOfBoundsException和其他异常的父级。因此,如果发生异常并且 then 存在捕获,Exception那么肯定会捕获它。因此,无法到达写在它下面的其他 catch 块,它们根本没用。因此,它将成为无法访问的代码,并且我们知道当某些语句无法访问时 JAVA 会出错。因此,它给出了编译时错误。

以防万一,如果您在子异常之后编写它,那么它的编译将没有任何错误。

于 2019-07-23T14:32:08.567 回答
0

就是这么简单……这里发生的异常是除以零异常,属于算术异常。所以它必须被“算术异常”捕获块捕获。但是这里它被 catch(exception e) 捕获了......所以必须像这样对 catch 进行排序以避免编译时错误:

catch(ArithmeticException e) {System.out.println("task1 completed");}
catch(ArrayIndexOutOfBoundsException e) { System.out.println("task2 completed");} catch(Exception e) {System.out.println( "任务完成");}

于 2017-05-08T09:28:06.807 回答