Java 尝试并最终给出无返回语句的异常,但在方法中编写返回语句时并没有异常
请解释为什么异常出现在第一个程序中,而不出现在第二个程序中 1) read方法中没有return语句Java 尝试并最终给出无返回语句的异常,但在方法中编写返回语句时并没有异常,java,return,try-finally,Java,Return,Try Finally,请解释为什么异常出现在第一个程序中,而不出现在第二个程序中 1) read方法中没有return语句 class Example { public static void read() { try { int i = 9/0; } finally { System.out.println("This proogram is giving ex
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();
}
}
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();
}
}
2) 在read方法中使用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();
}
}
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)不应在finally中使用,因为执行此类语句会使finally之前执行的其他指令无效
表示:如果try块的执行由于任何其他原因而突然完成,则执行finally块,然后有一个选择:
注意-finally块中的return语句将导致try或catch块中抛出的任何异常被丢弃。原因在try/finally块的执行规则中给出。本质上
- 如果try块抛出异常E并且finally正常完成,则整个try/finally抛出异常E
- 如果try块抛出E,但finally没有正常完成,则忽略E,并且由于finally块产生的原因,整个try/finally“突然完成”
显式
返回
被认为是突然的,而不是正常的完成,因此在您的示例2中,finally中的返回掩盖了try引发的除以零异常。在这两个实例中,代码都抛出一个java.lang.arithmetricException
,但是,finally
中的return
会丢弃异常,取而代之的是,该方法会退出,而不会将异常转发给调用方
这就是为什么通常在finally
-块中不应使用返回
的原因之一
以下章节对此进行了描述:
如果try块的执行由于抛出而突然完成
一个值V
,则有一个选择:
。。。(一些类似的,但在这种情况下,忽略了不相关的规则)
- 如果
的运行时类型与try语句的任何catch子句的可捕获异常类不兼容,则执行finally块。还有一个选择:V
- 如果finally块正常完成,那么try语句会因为抛出值
而突然完成V
- 如果finally块由于reason
而突然完成,则try语句由于reasonS
而突然完成(并且丢弃并忘记抛出值S
。V
- 如果finally块正常完成,那么try语句会因为抛出值
您可以在中找到突然完成和正常完成的定义。但是基本上,
返回
被认为是突然完成。请添加适当的语言标记,可能吗?请编辑您的问题并添加合适的语言标记。请包括异常StackTrace返回语句覆盖正在引发的异常。不要在finally块中放入return语句。那么,在第二个程序中,JVM不会被正确停止?那么,在第二个程序中,JVM不会被正确停止?