关于尝试捕获

时间:2012-04-13 00:51:04

标签: java exception-handling if-statement try-catch throw

我目前正在学习Java的入门课程,这是关于try-catch方法的。当我输入这个时,我的System.out.println语句不断重复。这是我的代码:

public static double exp(double b, int c) {
    if (c == 0) {
        return 1;
    }

    // c > 0
    if (c % 2 == 0) {
        return exp(b*b, c / 2);
    }
    if (c<0){
        try{
        throw new ArithmeticException();
        }
        catch (ArithmeticException e) {
            System.out.println("yadonegoofed");
        }
    }

    // c is odd and > 0
    return b * exp(b, c-1);
}

5 个答案:

答案 0 :(得分:3)

if (c<0){
    try{
    throw new ArithmeticException();
    }
    catch (ArithmeticException e) {
        System.out.println("yadonegoofed");
    }
}

// c is odd and > 0
return b * exp(b, c-1);

您的评论c is odd and > 0不正确 - 您实际上从未终止该例外。你抛出它,你立即抓住它,然后继续执行递归功能。最后,当您点击wraparound时,它将再次为正数,并且不会发生错误。 (这是大约20亿次迭代 - 不要等待。)

我不会在这里使用异常 - 你只需要终止递归。我会在检查0之前检查否定输入,然后在那里抛出异常,在调用者中捕获异常。

在伪代码中:

exp(double b, int c) {
    if (c < 0)
        throw new Exception("C cannot be negative");
    } else if (c % 2 == 0) {
        return exp(b*b, c / 2);
    } else {
        /* and so forth */
    }
}

答案 1 :(得分:2)

在创建自己的自定义异常时,您忘记了一个非常重要的部分。你忘了告诉方法它会抛出这样的方法。 您的第一行代码应如下所示:

public static double exp(double b, int c) throws ArithmeticException {

请注意,我自己测试了这个,它只会在输出中抛出异常一次。

答案 2 :(得分:1)

例如,如果c = -1 in,则第一个和第二个if失败,第三个if抛出异常然后打印错误,但事情进展因为你处理了excpetion。所以它调用exp(b,-2)。反过来,它在返回中调用exp(b,-3),依此类推。将C的值添加到println以进行验证。

答案 3 :(得分:0)

嗯,最后你有return b * exp(b, c-1);这将再次致电exp,这将再次召唤它。
所以功能会不断重复,所以会这样 System.out.println

答案 4 :(得分:0)

您的BASE案例非常具体......您的代码中的哪些内容保证c等于0?目前,这是退出递归调用的唯一方法。正如@Jay所说,你总是减去1导致抛出的异常,但是c在那时已经低于0,所以它不是EQUAL 0.改变你的第一个if语句来捕获值&lt; = 0你应该没事。

if( c <= 0 )
     return 1;