是否向上抛出明确抛出的异常?

时间:2017-04-11 21:15:05

标签: java exception

免责声明:我无法访问java编译器,也无法安装IDE,我的工作区没有给予足够的权限。

我试图了解Java如何处理异常并偶然发现了这个问题:

如果一个子类在捕获所有异常的catch块中显式抛出异常,它是否被抛出?例如,请考虑以下代码行:

public Class someClass  {
    public int value;
    public someClass()  {
        value = 1;
        try {
            value ++;
            if(value == 2)  {
                throw new Exception("value is 2");
            }
        }   catch   (exception e)   {
            System.out.println("I caught an exception.");
            throw new Exception("Does this exception get thrown upwards?");
            System.out.println("will this line of code get printed after the previously thrown exception?");
        }   finally {
            return;
        }
    }
}

public class anotherClass   {
    public static void main throws Exception{
        someClass someclass = new someClass();  // will this class catch the second explicitly thrown exception?
    }
}

因此,在try块中抛出一个新的异常,由以下catch块捕获。第二次抛出声明在哪里?如果有的话,它是否会进入调用类?此外,即使抛出异常不在finally块中,println语句是否会在抛出异常后执行?

感谢。

2 个答案:

答案 0 :(得分:1)

  

第二次抛出声明在哪里?它是否向上进入   如果有一个调用类?

是的,将向调用者方法抛出异常,在您的情况下,它是main()方法。

  

抛出异常后是否会执行println语句   即使它不在finally块中?

是的,System.out.println("I caught an exception.")将被执行,然后Exception对象将被抛给调用者(即main()),因此在catch块中,下面的行无法访问。

System.out.println("will this line of code get 
              printed after the previously thrown exception?");

重要的一点是,您始终可以使用exception.printStackTrace()(在catch块内)来检查方法堆栈中异常的传播方式。我建议您尝试这样做,这样您就可以清楚地看到异常如何在方法中传播。

我建议您参考here并清楚地了解方法链是如何执行的。

另外,您可能感兴趣的另一点是,当main()方法抛出异常时(即,main()本身或通过链,无论是什么情况),然后< strong> JVM捕获异常并关闭。

答案 1 :(得分:1)

虽然可能没有意图,但在特定情况下会抛出异常,您也可以通过throws的构造函数中缺少的someClass子句看到该异常。

原因是return块中的finally语句,导致java丢弃异常(和一个好的IDE给你一个&#34; finally块没有正常完成&#34;警告)。

更具体地说,section 14.20.2 of the specification表示:

  

如果catch块因为R而突然完成,那么最后   块被执行。然后有一个选择:

     
      
  • 如果finally块正常完成,则try语句突然完成,原因为R。

  •   
  • 如果finally块因为S而突然完成,那么try语句突然完成原因S(并且原因R被丢弃)。

  •   

原因S return语句而原因R throw new Exception("Does this exception get thrown upwards?");

您可以看到自己on ideone.com

class someClass {
    public int value;

    public someClass() {
        value = 1;
        try {
            value++;
            if (value == 2) {
                throw new Exception("value is 2");
            }
        } catch (Exception e) {
            System.out.println("I caught an exception.");
            throw new Exception("Does this exception get thrown upwards?");
        } finally {
            return;
        }
    }
}

class anotherClass {
    public static void main(String[] args) {
        try {
            someClass someclass = new someClass(); 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出:

I caught an exception.

但是就这个问题而言,javaguy的回答已经足够涵盖了这一点。