我有一个关于这段代码的问题,它与异常有关:
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()是否处理自己的异常?
发布于 2012-10-24 07:54:51
任何可以在方法内部引发的检查异常都必须在try/catch块中处理,或者必须声明该方法才能引发该异常。当您试图编译违反这些规则的代码时,Java编译器会发出警告。
m1()捕获唯一的检查异常,因此它处理自己的异常。如果从m1()的声明中删除throws Exception,它将正确编译,这意味着它确实处理了所有检查过的异常。
m2()不处理它的异常。如果从m2()的声明中删除throws Exception,您将得到一个编译错误,因为抛出了一个异常,但没有捕获或检查。
发布于 2012-10-24 07:59:41
在这种情况下,m1将处理自己的异常,而m2将传递或“抛出”异常到main。这是因为您在m1函数中使用了catch语句。基本上,从try块抛出的任何异常都将首先搜索此异常是否作为try的一部分处理(在您的代码中):
catch (Exception e2){ System.out.println("m1catch"); }
如果没有catch块,就像在m2中一样,该函数将假定异常是由更高层处理的,可能是由一个名为m2的函数处理的。因为main()在这里调用了m2,所以它是下一个要查找的地方,在那里catch块将处理异常。
发布于 2014-07-09 21:30:48
m1()通过使用try{}和catch来处理异常。抛出的异常是在catch块()中捕获的。
即使删除了抛出异常,编译器也不会抛出任何异常。
m2()不能捕获异常。只有try{}块用于抛出异常。该异常不会在该方法中处理。它被设置为抛出到main方法。只有在main方法中,才会捕获异常。如果从m2()中删除了抛出异常,编译器将抛出“未报告的异常;必须捕获或声明为抛出”。
https://stackoverflow.com/questions/13040869
复制相似问题