Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试并最终给出无返回语句的异常,但在方法中编写返回语句时并没有异常_Java_Return_Try Finally - Fatal编程技术网

Java 尝试并最终给出无返回语句的异常,但在方法中编写返回语句时并没有异常

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

请解释为什么异常出现在第一个程序中,而不出现在第二个程序中

1) 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();
    }
}
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块正常完成,那么try语句由于原因R而突然完成
  • 如果finally块由于原因S而突然完成,那么try语句由于原因S而突然完成(并且原因R被丢弃)

  • 注意-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
    ,则有一个选择:

    。。。(一些类似的,但在这种情况下,忽略了不相关的规则)

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

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

      • 如果finally块由于reason
        S
        而突然完成,则try语句由于reason
        S
        而突然完成(并且丢弃并忘记抛出值
        V


    您可以在中找到突然完成和正常完成的定义。但是基本上,
    返回
    被认为是突然完成。

    请添加适当的语言标记,可能吗?请编辑您的问题并添加合适的语言标记。请包括异常StackTrace返回语句覆盖正在引发的异常。不要在finally块中放入return语句。那么,在第二个程序中,JVM不会被正确停止?那么,在第二个程序中,JVM不会被正确停止?