尝试和最后给出没有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块,然后有一个选择:
- 如果finally块正常完成,则try语句突然完成,原因是R.
- 如果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
的代码,但是finally
的return
丢弃了exception,而是退出方法而不将exception转发给调用者。
这就是为什么你不应该在finally
-block中使用return
的原因之一。
这在Java语言规范(8),14.20.2执行try-finally
和try-catch-finally
:
如果try块的执行由于抛出值
V
突然完成,那么有一个选择:…( 有些类似,但对于这种情况,不相关的规则被遗漏 )
如果
V
的运行时类型与try语句的任何catch子句的可捕获exception类不兼容,则执行finally块。 然后有一个选择:
如果finally块正常完成,那么try语句会因为抛出值
V
突然完成。如果finally块因为原因
S
突然完成,那么try语句突然完成原因S
(并且丢弃并抛弃值V
的抛出)。
您可以在JLS 14.1正常和突然完成报表中找到突然和正常完成的定义。 但基本上return
被视为突然完成。
- 如何创建oracle.sql.ARRAY对象?
- 如何在2D数组中更改数组元素的值?
- 识别多文件上载中的每个字段
- 如何在清单文件中指定依赖项,然后将其包含到我的.jar文件中?
- Spring 3 + Tomcat 6:表单validationexception – java.lang.NoSuchMethodError:javax.el.ExpressionFactory.newInstance()Ljavax / el / ExpressionFactory;
- 分裂不正常
- AbstractApplicationContext vs ApplicationContext
- Mockitovalidation在我的情况下调用一次函数
- 在使用commons-io的IOUtils.toString(输入)后,是否需要手动关闭输入流?