尝试和最后给出没有return语句的exception,但是当在方法中写入return语句时没有exception

请解释为什么Exception出现在第一个程序中而不是出现在第二个程序中。

1)读取方法中没有return语句

class Example { public static void read() { try { int i = 9/0; } finally { System.out.println("This proogram is giving exception"); } } public static void main(String[] fel) { read(); } } 

2)在read方法中使用return语句

 class Example { public static void read() { try { int i = 9/0; } finally { System.out.println("This proogram is not giving exception"); return; } } public static void main(String[] fel) { read(); } } 

最终不应该在内部使用分支语句(return,goto),因为执行此类语句会使最终执行之前执行的其他指令无效。

Java语言规范说:如果try块的执行由于任何其他原因R突然完成,则执行finally块,然后有一个选择:

  1. 如果finally块正常完成,则try语句突然完成,原因是R.
  2. 如果finally块因为原因S而突然完成,则try语句突然完成,原因是S(并且原因R被丢弃)。

– finally块内的return语句将导致丢弃try或catch块中可能抛出的任何exception。

原因在管理try / finally块执行的Java语言规范规则中给出。 实质上

  • 如果try块抛出exceptionE并且finally终止正常则整个try / finally抛出E
  • 如果try块抛出E但最终没有正常完成,则忽略E并且整个try / finally“突然完成”,因为finally块产生的原因

显式return被认为是突然而不是正常完成,因此在您的示例2中,finally内部的返回屏蔽了try引发的除零exception。

在这两个实例中,抛出java.lang.ArithmeticException的代码,但是finallyreturn丢弃了exception,而是退出方法而不将exception转发给调用者。

这就是为什么你不应该在finally -block中使用return的原因之一。

这在Java语言规范(8),14.20.2执行try-finallytry-catch-finally

如果try块的执行由于抛出值V突然完成,那么有一个选择:

…( 有些类似,但对于这种情况,不相关的规则被遗漏

  • 如果V的运行时类型与try语句的任何catch子句的可捕获exception类不兼容,则执行finally块。 然后有一个选择:

    • 如果finally块正常完成,那么try语句会因为抛出值V突然完成。

    • 如果finally块因为原因S突然完成,那么try语句突然完成原因S (并且丢弃并抛弃值V的抛出)。

您可以在JLS 14.1正常和突然完成报表中找到突然和正常完成的定义。 但基本上return被视为突然完成。