Java异常捕获初学者

时间:2016-03-22 10:56:26

标签: java try-catch

我学习尝试并使用java捕获异常,我遇到了一些问题。的确,我已经设置了ArithmeticException catch&尝试但在某些情况下,例外不会被捕获......

My 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;
        }


    }

}

My 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));


    }

}

我得到了这个:

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)

我不明白为什么异常没有抓住...

部分输出代码可能是法语我为此给您带来的不便表示歉意...

最诚挚的问候, ASTRUS

4 个答案:

答案 0 :(得分:3)

您可以在控制台中看到异常。但它被throw e;再次抛出。如果删除它,则不会将堆栈跟踪写入控制台。

答案 1 :(得分:1)

您不再使用main方法捕捉它(与您捕获并重新抛出它的其他方法不同)。然后它将被抛出main方法并由该线程的默认异常处理程序处理,从而打印出异常的完整堆栈跟踪。

在主方法中添加try-catch重新抛出异常,以避免打印堆栈跟踪。

答案 2 :(得分:1)

这一行

throw e;

在boucle方法之外将你的异常抛到main中。您需要在main方法中捕获此异常。

答案 3 :(得分:1)

从boucle方法中删除try-catch并输入main方法。

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 !");

        }

    }

}