2016-03-22 10 views
2

私はJavaで例外をキャッチしようとしていますが、いくつか問題があります。確かに、私はセットアップはArithmeticExceptionキャッチに&試しているが、例外はいくつかのケースでキャッチされていません...Java例外catch初心者

マイRecursion.java:

import java.lang.ArithmeticException; 

public class Recursion { 

    private int u0; 
    private int u1; 

    public Recursion(int u0, int u1) { 

     this.u0 = u0; 
     this.u1 = u1; 

    } 

    public int boucle (int n) throws ArithmeticException{ 

     switch (n) { 
     case 0 : 
      return this.u0; 
     case 1 : 
      return this.u1; 
     } 


     try{ 

      if ((n%2) == 0) { 
       return (boucle(n-1)/boucle(n-2)) - (boucle(n-2)/boucle (n-1)); 
      } 

      else{ 
       return (boucle(n-2)/boucle(n-1)) - (boucle(n-1)/boucle (n-2)); 
      } 
     } 
     catch (ArithmeticException e){ 
      System.out.println("Erreur division par 0 !"); 
      throw e; 
     } 


    } 

} 

マイMain.java:

public class Main { 

    public static void main(String[] args){ 

     Recursion monObjet1 = new Recursion (100,2); 
     Recursion monObjet2 = new Recursion (100,1); 

     System.out.println(monObjet2.boucle(10)); 


    } 

} 

I入手:

Erreur division par 0 ! 
Erreur division par 0 ! 
Erreur division par 0 ! 
Erreur division par 0 ! 
Exception in thread "main" java.lang.ArithmeticException:/by zero 
    at Recursion.boucle(Recursion.java:32) 
    at Recursion.boucle(Recursion.java:32) 
    at Recursion.boucle(Recursion.java:32) 
    at Recursion.boucle(Recursion.java:28) 
    at Main.main(Main.java:11) 

なぜ例外がキャッチされないのか分かりません出力コードの

いくつかはフランス語であることができる...私はあなたのコンソールで見ることができるよう

よろしく、 アストラス

+4

例外をキャッチしてから、「スローe」で再度スローします。 – wero

答えて

1

あなたはこれ以上あなたのmainメソッドでそれをキャッチしていません(あなたがそれを捕まえて再スローする他の方法とは異なります)。その後、メインメソッドからスローされ、そのスレッドのデフォルト例外ハンドラによって処理され、例外の完全なスタックトレースが出力されます。

try-catchをメインメソッドに追加し、を入力しないは、スタックトレースの印刷を避けるために例外を再発行します。

3

は例外がcatchedさ...不便をおかけして申し訳ございません。しかしそれはthrow e;によって再び投げられます。これを削除すると、スタックトレースはコンソールに書き込まれません。

1

このライン

throw e; 

をメインにブークレ方法の外に、あなたの例外がスローされます。メインのメソッドでこの例外を捕捉する必要があります。

1

boucleメソッドからtry-catchを削除し、メインメソッドを挿入するだけです。

import java.lang.ArithmeticException; 

class Recursion { 

    private int u0; 
    private int u1; 

    public Recursion(int u0, int u1) { 

     this.u0 = u0; 
     this.u1 = u1; 

    } 

    public int boucle(int n) throws ArithmeticException { 

     switch (n) { 
     case 0: 
      return this.u0; 
     case 1: 
      return this.u1; 
     } 

     if ((n % 2) == 0) { 
      System.out.println("if " + (n - 1)); 

      return (boucle(n - 1)/boucle(n - 2)) 
        - (boucle(n - 2)/boucle(n - 1)); 
     } 

     else { 
      System.out.println("else" + (n - 1)); 
      return (boucle(n - 2)/boucle(n - 1)) 
        - (boucle(n - 1)/boucle(n - 2)); 
     } 
    } 

    public static void main(String[] args) { 

     Recursion monObjet1 = new Recursion(100, 2); 
     Recursion monObjet2 = new Recursion(100, 1); 
     try { 
      System.out.println(monObjet2.boucle(10)); 
     } catch (ArithmeticException e) { 

      System.out.println("Erreur division par 0 !"); 

     } 

    } 

} 
+0

ありがとうございました!私は "スローe"がやっていたことを本当に理解していなかったと思う...このラインが何をしているのか教えてくれますか? – Astrus