2

我对此代码有疑问,它与异常有关:

public class MTest {
    public static void main(String args[]) {
        try {
            m1();
            m2();
        } catch (Exception e1) {
            System.out.println("e");
        }
    }

    static void m1() throws Exception {
        try {
            throw new Exception();
        } catch (Exception e2) {
            System.out.println("m1catch");
        }
    }

    static void m2() throws Exception {
        try {
            throw new Exception();
        } finally {
            System.out.println("Finally");
        }       
    }
}

所以根据上面的代码,教科书告诉我m2()方法不处理自己的异常,而是传递给main。这是什么意思?我怎么能从上面的代码中看出?是否m1()处理自己的异常?

4

3 回答 3

1

任何可以在方法内抛出的已检查异常都必须在 try/catch 块中进行处理,或者必须声明该方法以抛出该异常。当您尝试编译违反这些规则的代码时,Java 编译器会报错。

m1()捕获唯一的已检查异常,因此它处理自己的异常。如果您throws Exceptionm1()的声明中删除,它将正确编译,这意味着它确实处理了所有已检查的异常。

m2()不处理它的异常。如果你throws Exceptionm2()'s 声明中删除,你会得到一个编译错误,因为抛出了一个异常但没有被捕获或检查。

于 2012-10-23T23:54:51.113 回答
1

在这种情况下,m1 将处理它自己的异常,而 m2 将把异常传递或“抛出”到 main。这是因为您在 m1 函数中有 catch 语句。基本上,从 try 块抛出的任何异常都将首先搜索是否将此异常作为 try 的一部分处理(在您的代码中):

catch (Exception e2){ System.out.println("m1catch"); }

如果没有 catch 块,就像在 m2 中一样,该函数将假定异常被更高层处理,可能由调用 m2 的函数处理。因为 main() 调用了 m2,所以它是下一个要查看的地方,catch 块将在那里处理异常。

于 2012-10-23T23:59:40.657 回答
0

m1()使用try{}and处理异常catch。抛出的异常在catch block()中被捕获。

即使 throws Exception 被移除,编译器也不会抛出任何异常。

m2()没有捕捉到异常。只有try{}块用于抛出异常。异常不在方法内处理。它设置为 throw 到 main 方法。只有在 main 方法中,才会捕获异常。如果从 中删除 throws Exception m2(),编译器将抛出“未报告的异常;必须捕获或声明为抛出”

于 2014-07-09T13:30:47.667 回答