2013-08-27 31 views
-4
public class Confusion { 
    Confusion(int i) { 
     int j = 5; 
     int[] a = new int[2]; 
     try { 
      a[0] = 4; 
      if (i <= 0) { 
       int k = j/i; 
      } else { 
       System.out.println(j/i); 
      } 
     } catch (ArithmeticException sa) { 
      System.out.println("Wrong value" + sa); 
     } catch (ArrayIndexOutOfBoundsException e) { 
      System.out.println("out of range massage in Class"); 
     } finally { 
      System.out.println("Executing finally block in code"); 
     } 
    } 

    void k() { 
     int[] a = new int[2]; 
     { 
      try { 
       a[4] = 4; 
      } catch (ArrayIndexOutOfBoundsException e) { 
       System.out.println("out of range"); 
      } 
     } 
    } 
} 

public class Nested { 
    public static void main(String[] args) { 
     Confusion c = new Confusion(2); 
     Confusion c1 = new Confusion(0); 
     c1.k(); 
     c.k(); 
    } 
} 

输出:异常处理,最后在Java阻断

-2 
Executing finally block in code 
Wrong valuejava.lang.ArithmeticException:/by zero 
Executing finally block in code 
out of range 
out of range 

每当我执行finally{}块下面是越来越两次执行它写在代码中。不知道为什么会发生这种情况。我只想运行一次finally块。 有没有办法在单一方法中抛出多个异常?

+0

因为你说了两次,不是吗? – Leri

+0

而不是在构造函数中有逻辑,并有这种“问题”,你可以将逻辑移动到一个方法,所以它非常简单... 2方法调用= 2'try {} catch {} finally {}'块 – araknoid

回答

3

它因为你有两个Confusion对象。因此,构造函数将被执行两次。

confusion c=new confusion(2); 
confusion c1=new confusion(0); 
2
confusion c=new confusion(2); 
confusion c1=new confusion(0); 

这就是为什么你从最后得到2个输出。

1

这是因为要创建两个对象c1c

1

您正在尝试两次调用代码。

confusion c=new confusion(2); 
confusion c1=new confusion(0); 

这意味着,作为最终都会发生的尝试被调用时,它会打印...

Executing finally block in code

如果你再次调用它,

confusion c1=new confusion(3);

它会打印出最后第三次的内容。

1

您正在使用以下代码创建两个对象。这就是为什么finally块被执行两次。

confusion c=new confusion(2); 
confusion c1=new confusion(0); 

试试这一个,请

public static void main(String[] args){ 
    confusion c=new confusion(2); 
    confusion c1=new confusion(0); 
    confusion c1=new confusion(10); 
    confusion c1=new confusion(5); 
} 

现在终于拨通块4倍。

Java中的构造函数是在创建对象时执行的代码块。

请仔细阅读构造参考http://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html

0

因为你是创建两个困惑的对象。因此,finally块将被执行两次。

confusion c=new confusion(2); 
confusion c1=new confusion(0); 

如果你想最后只执行一次。试试这个代码

public class Confusion { 
    Confusion(int i) { 
     int j = 5; 
     int[] a = new int[2]; 
     a[0] = 4; 
     if (i <= 0) { 
      int k = j/i; 
     } else { 
      System.out.println(j/i); 
     } 
    } 

    void k() { 
     int[] a = new int[2]; 
      a[4] = 4; 
    } 
} 

public class Nested { 
    public static void main(String[] args) { 
     try{ 
      Confusion c = new Confusion(2); 
      Confusion c1 = new Confusion(0); 
      c1.k(); 
      c.k(); 
     }catch (ArithmeticException sa) { 
      System.out.println("Wrong value" + sa); 
     } catch (ArrayIndexOutOfBoundsException e) { 
      System.out.println("out of range massage in Class"); 
     } finally { 
      System.out.println("Executing finally block in code"); 
     } 
    } 
    }