2

我目前正在学习 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);
}
4

5 回答 5

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 */
    }
}
于 2012-04-13T00:57:33.633 回答
2

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

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

请注意,我自己对此进行了测试,它只会在您的输出中抛出一次异常。

于 2012-04-13T01:05:37.020 回答
1

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

于 2012-04-13T00:57:27.017 回答
0

好吧,最后你有return b * exp(b, c-1);this expwill call again which will call it again。
所以这个函数会不断重复,所以也会如此 System.out.println

于 2012-04-13T00:55:57.693 回答
0

你的基本情况是非常具体的......你的代码保证c等于0?目前,这是您退出递归调用的唯一方式。正如@Jay 所说,你总是减去 1 会导致抛出的异常,但此时 c 已经低于 0,因此它不等于 0。将你的第一条if语句更改为捕获值 <= 0,你应该没问题。

if( c <= 0 )
     return 1;
于 2012-04-13T00:59:11.313 回答