2016-03-22 2 views
2

Я изучаю попытку и исключаю исключение из java, и у меня есть некоторые проблемы. На самом деле, я имею установку ArithmeticException улов & попробовать, но исключение не поймать в некоторых случаях ...Java exceptions catch Beginner

Мой 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

вы поймаете исключение, но затем снова выбросите его с помощью 'throw e' – wero

ответ

1

Вы больше не поймаете его в своем методе main (в отличие от других методов, в которых вы его поймаете и перевернете). Затем он будет выброшен из основного метода и обработан обработчиком исключений по умолчанию для этого потока, что приведет к печати полного stacktrace исключения.

Добавить try-catch по вашему основному методу и не Восстановить исключение, чтобы избежать печати стека.

3

Исключение пойманной, как вы можете увидеть в консоли. Но он снова бросается на throw e;. Если вы удалите его, трассировка стека не будет записана на консоль.

1

Эта линия

throw e; 

Бросок исключения вне метода букле в основной. Вы должны поймать это исключение в своем основном методе.

1

Просто удалите пробку из метода boucle и поставьте основной метод.

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

Спасибо за ваш ответ! Я думаю, что я действительно не понимал, что делает «бросок э» ... Не могли бы вы объяснить мне, что делает эта линия, пожалуйста? – Astrus