2013-08-27 65 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"); 
     } 
    } 
    }