Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.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 try/finally不带catch和return值_Java_Exception Handling_Try Catch Finally - Fatal编程技术网

Java try/finally不带catch和return值

Java try/finally不带catch和return值,java,exception-handling,try-catch-finally,Java,Exception Handling,Try Catch Finally,我有一个计划如下: public class Main { public static void main(String[] args)throws Exception { int res = test(); System.out.println("after call , res = " + res) ; } public static int test()throws Exception { try

我有一个计划如下:

public class Main {
    public static void main(String[] args)throws Exception
    {
        int res = test();
        System.out.println("after call , res = " + res) ;
    }

    public static int test()throws Exception
    {
        try
        {
            return 10/0;
        }
        finally
        {
            System.out.println("finally") ;
        }
    }
}
运行上述程序后,在控制台中看到以下结果:

finally
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at Main.test(Main.java:17)
    at Main.main(Main.java:7)
finally
after call , res = 20
此行为是正常的,因为异常被抛出到main方法

然后我更改代码如下:

public class Main {
    public static void main(String[] args)throws Exception
    {
        int res = test();
        System.out.println("after call , res = " + res) ;
    }

    public static int test()throws Exception
    {
        try
        {
            return 10/0;
        }
        finally
        {
            System.out.println("finally") ;
            return 20;
        }
    }
} 
当运行上述程序时,我在控制台中看到以下结果:

finally
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at Main.test(Main.java:17)
    at Main.main(Main.java:7)
finally
after call , res = 20
我的问题与第二种格式有关。为什么在finally块中返回时,异常没有抛出到main方法

  • 如果在
    finally
    部分中使用
    return
    ,则会丢失异常。方法将以返回值的正常类型结束
  • 如果在
    finally
    部分中未使用
    return
    ,则在您的情况下,方法将完成,但出现异常

  • 第一种情况:

    try {
        throw new Exception();
    } finally {
        //Exception will be lost, normal shutdown of the method
        return;
    }
    
    第二种情况:

    try {
        throw new Exception();
    } finally {
        //Exception won't be lost, we'll get Exception in the main method
    }
    
    第三种情况:

    try {
        throw new Exception();
    } finally {
        throw new IOException();
        // we lost Exception, IOException will be thrown
    }
    


    注意:使用
    finally
    部分抛出异常或返回值是一种不好的做法。例如,创建此部分是为了关闭外部资源

    Java的
    return
    并不总是返回,可能会接受。

    当抛出异常时,它将首先通过
    最后通过
    块。

    如果
    finally
    块没有返回或抛出任何内容,则传递原始异常

    另一方面,如果
    finally
    块返回一个值,则该异常将不再传播。

    • 参考:

    finally块中的所有内容都是在抛出异常之前执行的,因此如果返回finally块,则根本不会抛出异常。出于这个原因,从finally块返回通常是个坏主意


    请看一些关于这方面的信息

    最后查看try-catch的执行情况

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

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

    如果finally块因原因S而突然完成,则try语句因原因S而突然完成(,值V的抛出被丢弃并被遗忘)

    finally块中的return语句基本上停止了 try块中发生的异常无法向上传播 虽然没有被抓到

    但是Java编译器在编写这段代码时会发出警告。 虽然
    返回语句
    应该始终位于
    try块
    ,并且
    最后
    块通常用于
    释放/关闭连接、指针等。

    这似乎是
    Java
    的行为方式


    看一看

    如果你读到了最后的java文档,它会说

    它允许程序员避免因返回、继续或中断而意外绕过清理代码。将清理代码放入finally块始终是一种良好的做法,即使在没有预期异常的情况下也是如此。


    因此,如果将清理代码放在finally块之后,如果出现异常,它将不会被调用。

    在第一种情况下,finally块作为其行为执行,但它没有捕获异常,但通过main方法引发异常。通过这个例子来检查它

    public class HelloWorld{
    
         public static void main(String []args)throws Exception
         {
            try
            {
            int res = test();
            System.out.println("after call , res = " + res) ;
            }
            catch(Exception ex)
            {
                System.out.println("Main Catch") ;
            }
         }
         public static int test()throws Exception
         {
            try
            {
                return 10/0;
            }
            finally
            {
                System.out.println("finally") ;
            }
        }
    }
    
    在上面的代码中,
    Main Catch
    被执行

    在第二种情况下,您返回了数字,因此main方法中没有异常。

    来自(我的重点):

    如果try块的执行由于抛出而突然完成 一个值V,则有一个选择:
    […]
    如果V的运行时类型与try语句的任何catch子句的可捕获异常类不兼容,则finally 块被执行。还有一个选择:

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

    • 如果finally块因原因S而突然完成,则try语句因原因S而突然完成(),并且值V的抛出为 被抛弃和遗忘

    这意味着如果在
    finally
    块中
    return
    ,该方法将返回而不引发异常

    除了
    return
    ,还有其他语句可能会导致
    finally
    块突然完成并忘记异常。它们在中定义。基本上,它是
    break
    continue
    return
    或异常(抛出或由语句/方法引起)。complete
    try/catch/finally
    块由于这个原因完成


    try/catch/finally
    的规范中还有一些情况,尤其是在没有异常或存在匹配的catch子句的情况下。它可以归结为
    finally
    beats
    catch
    beats
    try
    ,因为finally块始终被执行,无论异常是否发生,如果从finally返回,则表示将执行发送到调用方法,并且将丢失异常。因此,它也会产生警告

    在第一个程序中,当try块发生算术异常时,调用finally块,执行finally块后,异常发生。因为异常不是由程序处理的。 当finally块执行时,第二个程序在返回语句执行之后执行,并且没有异常发生,因为在返回语句执行之后,编译器在main方法中返回,剩余的执行将不会在finally块中执行。所以不会发生异常


    这个可能是:?请看一看:众所周知,在
    finally
    bloc中不使用
    return