首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理异常

处理异常
EN

Stack Overflow用户
提问于 2012-10-24 07:30:52
回答 3查看 275关注 0票数 2

我有一个关于这段代码的问题,它与异常有关:

代码语言:javascript
复制
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()是否处理自己的异常?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-24 07:54:51

任何可以在方法内部引发的检查异常都必须在try/catch块中处理,或者必须声明该方法才能引发该异常。当您试图编译违反这些规则的代码时,Java编译器会发出警告。

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

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

票数 1
EN

Stack Overflow用户

发布于 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块将处理异常。

票数 1
EN

Stack Overflow用户

发布于 2014-07-09 21:30:48

m1()通过使用try{}catch来处理异常。抛出的异常是在catch块()中捕获的。

即使删除了抛出异常,编译器也不会抛出任何异常。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13040869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档