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
块返回一个值,则该异常将不再传播。
- 参考:
请看一些关于这方面的信息 最后查看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
或异常(抛出或由语句/方法引起)。completetry/catch/finally
块由于这个原因完成
在
try/catch/finally
的规范中还有一些情况,尤其是在没有异常或存在匹配的catch子句的情况下。它可以归结为finally
beatscatch
beatstry
,因为finally块始终被执行,无论异常是否发生,如果从finally返回,则表示将执行发送到调用方法,并且将丢失异常。因此,它也会产生警告
在第一个程序中,当try块发生算术异常时,调用finally块,执行finally块后,异常发生。因为异常不是由程序处理的。
当finally块执行时,第二个程序在返回语句执行之后执行,并且没有异常发生,因为在返回语句执行之后,编译器在main方法中返回,剩余的执行将不会在finally块中执行。所以不会发生异常
这个可能是:?请看一看:众所周知,在
finally
bloc中不使用return