在调用链上传递异常

时间:2011-12-08 08:41:59

标签: java

希望通过在我的方法throws子句中声明异常以及为什么我想要这样做来解释通过调用链传递异常意味着什么。

以下是我对抛出自己异常的理解的一个例子。

public class ExceptionThrow {
    char[] charArray = new char[] { 'c', 'e', 'a', 'd' };

    void checkArray() throws ABException {
        for (int i = 0; i < charArray.length; i++) {
            switch (charArray[i]) {
            case 'a':
                throw new ABException();
            case 'b':
                throw new ABException();// creating the instance of the
                                        // exception anticipated
            default:
                System.out.println(charArray[i] + " is not A or a B");

            }
        }
    }

    public static void main(String[] args) {
        ExceptionThrow et = new ExceptionThrow();

        try {
            et.checkArray();
        } catch (ABException ab) {
            System.out.println(ab.getMessage() + " An exception did actually occur");
        } finally {
            System.out.println("This block will always execute");
        }

    }
}

class ABException extends Exception {
}

如何将'异常传递给调用链'?

问候 阿里安

3 个答案:

答案 0 :(得分:21)

“调用链”,通常也称为“堆栈跟踪”,是导致单行执行的所有嵌套方法调用的列表。在您的情况下,其深度为2:main调用checkArray,但可能有数十种方法。

当代码中发生异常时,它会中断当前方法并将控件返回到堆栈跟踪上的上一个方法。如果此方法可以处理异常(使用catch),则catch将被执行,异常将停止冒泡。如果没有,异常将冒出堆栈跟踪。最终,如果它到达main并且main无法处理它,程序将会因错误而停止。

在您的特定情况下,throw new ABException()会创建并抛出一个ABException来中断checkArray方法。然后,您的主要内容catch(ABException ab)会捕获该异常。所以根据你的问题,你可以说这段代码在调用链上传递了异常。

还有很多话要说,特别是与已检查/未检查的异常相关。如果您有更具体的问题,请随时提出。

答案 1 :(得分:4)

首先,您必须将throws ABException添加到main方法,然后删除捕获异常的块或在记录后重新抛出它

throw ab;

答案 2 :(得分:1)

例如,您可以通过在main()中捕获它,但将其传递给调用main()的逻辑片段来执行此操作。在这种情况下,它是微不足道的,因为main()是你的程序的入口点......

你也可以重写你的方法

void checkArray() throws ABException {
    for (int i = 0; i < charArray.length; i++) {
        check(charArray[i]);
    }
}

void check(char c) throws ABException {
    switch (c) {
        case 'a':
            throw new ABException();
        case 'b':
            throw new ABException();// creating the instance of the
                                    // exception anticipated
        default:
            System.out.println(c + " is not A or a B");
    }
}

现在更清楚checkArray()如何将check()的异常传递给调用链“