【问题标题】:Java Compile-time error and multiple catch blocks in exception handlingJava 编译时错误和异常处理中的多个 catch 块
【发布时间】:2013-02-06 08:19:12
【问题描述】:

给定一段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......");
   }
}  

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

【问题讨论】:

  • 哪个错误?我怀疑编译器检测到除以零。
  • 你为什么要这样做? a[5]= 30/0 ?
  • 合并以下答案的快速说明,当捕获异常时,请务必从最具体的(ArrayIndexBoundsException 等)转移到最通用的(Exception)。以另一种方式进行(就像您正在做的那样)将导致第一个捕获捕获所有内容。

标签: java exception compile-time


【解决方案1】:

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

【讨论】:

    【解决方案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");}  
    

    【讨论】:

    • thanx,现在有问题了。
    【解决方案3】:

    编译器发现捕获ArithmeticException after 它的超类是不可能的;第一个 catch 子句总是匹配的。

    【讨论】:

      【解决方案4】:

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

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

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

      您是否想了解NullPointerException 是什么?

      【讨论】:

      • 感谢您的回答,现在知道了。
      【解决方案5】:

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

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

      希望对你有帮助!!!

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多