在方法体内抛出异常并在之后捕获它

时间:2014-08-20 18:46:57

标签: java exception

主要班级:

class IO 
{
    static void m() throws Exception
    {
        try
        {
            throw new Exception();
        } finally{
            System.out.println("finally");
        }
    }
    public static void main(String [] args) 
    {
        try {
            m();
        } catch (Exception ex) {
             System.out.println("catch");
        }
        System.out.println("finish");
    }
}

输出:

finally
catch
finish

这种行为对我来说不清楚。 JLS 8第11.3条规定:

  

如果找不到可以处理异常的catch子句,那么   当前线程(遇到异常的线程)   的终止即可。在终止之前,所有finally子句都被执行并且   未捕获的异常根据以下规则处理:

     

如果当前线程设置了未捕获的异常处理程序,那么   处理程序已执行。

     

否则,为作为父>的ThreadGroup调用方法uncaughtException。当前线程。如果ThreadGroup及其父ThreadGroups没有覆盖   uncaughtException,然后调用默认处理程序的uncaughtException方法。

我预计输出只会finally,因为当前线程已终止。我还没有产生任何其他线程,因为输出必须是finally,但事实并非如此。请帮助我理解。

3 个答案:

答案 0 :(得分:2)

  

如果找不到可以处理异常的catch子句,[...]

但是你有一个catch子句可以处理异常。由于抛出异常,您的m方法将突然完成。在main方法中The exception will be caught and handle d,然后将与主线程一起正常完成。

答案 1 :(得分:1)

通过将函数替换为代码,可能更容易看到它。

class IO 
{
    public static void main(String [] args) 
    {
        try { //4 Now goes to the outer try
            try //2 Checks this try for the catch, but doesn't find it
            {
                throw new Exception(); //1 Hits the exception
            } finally{ //3 Executes this because there is no catch for this try
                System.out.println("finally");
            }
        } catch (Exception ex) { //5 Finds the catch
             System.out.println("catch");
        }
        //6 Continues as if nothing happened
        System.out.println("finish");
    }
}

答案 2 :(得分:0)

以下是流程:

    class IO 
    {
        static void m() throws Exception
        {
            try
            {   //2
                throw new Exception();
            } finally{
                    //3
                System.out.println("finally");
            }
        }
        public static void main(String [] args) 
        {
            try {
                m();//1 method called
            } catch (Exception ex) {
                  //4 the control returns
                 System.out.println("catch");
            }
                //5
            System.out.println("finish");
        }
    }

只有在未处理异常时才终止该线程。