“全栈2019”Java异常第二十一章:finally不被执行的情况

206 阅读6分钟

难度

初级

学习时间

20分钟

适合人群

零基础

开发语言

Java

开发环境

  • JDK v11
  • IntelliJ IDEA v2018.3

友情提示

  • 本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
  • 本章内容针对零基础或基础较差的同学比较友好,可能对于有基础的同学来说很简单,希望大家可以根据自己的实际情况选择继续看完或等待看下一篇文章。谢谢大家的谅解!

1.finally

finally我们在《“全栈2019”Java异常第五章:一定会被执行的finally代码块》《“全栈2019”Java异常第六章:finally代码块作用域详解》两章中学习过,这里简单回顾一下。

对于finally的总结,我们之前总结的有4条:

  • finally代码块是在try代码块退出时必须执行的代码块。
  • finally代码块是在try代码块正常执行完毕后执行。
  • 我们又得知finally在try遇到异常退出时,在正确匹配到异常的catch代码块执行完毕之后执行。
  • fianlly在try代码块即使遇到异常退出,catch也没有捕获到该异常的情况下,依然会执行。

这里演示一下try-catch-finally代码块。

演示:

请在try-catch-finally代码块里面各输出一句话。

请观察程序代码及结果。

代码:

Main类:

“全栈2019”Java异常第二十一章:finally不被执行的情况

结果:

“全栈2019”Java异常第二十一章:finally不被执行的情况

从运行结果来看,try、catch和finally代码块都被执行了,而我们的finally代码块是一定会被执行的代码块,接下来我们就来讨论什么情况下finally不会被执行。

2.遇到System.exit()程序退出时,finally代码块不会被执行

当程序正常执行完退出时,finally代码块会被执行。

这里的“程序正常执行完”是指程序按照代码执行完毕。

当我们遇到System.exit()方法时,程序就退出了,finally不会被执行。

接下来,来演示一下。

演示:

请使用System.exit()方法。

请观察程序代码及结果。

代码:

Main类:

“全栈2019”Java异常第二十一章:finally不被执行的情况

结果:

“全栈2019”Java异常第二十一章:finally不被执行的情况

从运行结果来看,结果是符合我们预期的,我们在程序代码中插入System.exit()方法:

“全栈2019”Java异常第二十一章:finally不被执行的情况

System.exit()方法里面的参数什么意思?

System.exit()方法参数是一个int类型的状态码,其中

0:程序正常退出。

非0:程序异常退出。

然后我们可以看到我们的程序只有try代码块被执行了:

“全栈2019”Java异常第二十一章:finally不被执行的情况

我们可以简单分析一下程序代码,一目了然。

首先,我们程序执行try代码块里面的语句:

“全栈2019”Java异常第二十一章:finally不被执行的情况

这行代码执行完就打印输出语句:

“全栈2019”Java异常第二十一章:finally不被执行的情况

然后继续往下执行:

“全栈2019”Java异常第二十一章:finally不被执行的情况

当执行到System.exit()方法时,表示程序要退出了,这就好比我们强制退出某个应用程序。于是后面的代码都不会被执行了。

把System.exit()方法放在抛异常代码后面会怎样?

我们更改Main类试试:

“全栈2019”Java异常第二十一章:finally不被执行的情况

运行程序,执行结果:

“全栈2019”Java异常第二十一章:finally不被执行的情况

错误信息:

“全栈2019”Java异常第二十一章:finally不被执行的情况

文字版:

Information:java: Errors occurred while compiling module 'Hello'Information:javac 11 was used to compile java sourcesInformation:2019-01-13 11:34 - Compilation completed with 1 error and 0 warnings in 2 s 222 ms/Users/admin/Workspace/Java/Hello/src/main/Main.javaError:(16, 13) java: 无法访问的语句
“全栈2019”Java异常第二十一章:finally不被执行的情况

这里小伙伴们,看清楚了,我们的System.exit()方法是永远都无法执行到的,也就是说这样的代码是没有意义的。

“全栈2019”Java异常第二十一章:finally不被执行的情况

因为我们程序在执行到“throw new Exception();”时就进入了异常处理程序阶段,“throw new Exception();”下面的代码就永远得不到执行。

把System.exit()方法放在catch代码块中会怎样?

我们还是来更改Main类试试:

“全栈2019”Java异常第二十一章:finally不被执行的情况

运行程序,执行结果:

“全栈2019”Java异常第二十一章:finally不被执行的情况

从运行结果来看,我们的try代码块和catch代码块都执行了,finally代码块没有被执行,说明只要是在finally代码块之前遇到System.exit()方法,finally代码块永远得不到执行。

3.遇到return时,finally仍然会被执行

有不少小伙伴认为当我们try-catch-fianlly程序在finally代码前遇到return时,finally不会被执行,这里我们就来实验一下,看我们finally遇到return时,会不会被执行。

演示:

请在finally代码块之前return。

请观察程序代码及结果。

代码:

Main类:

“全栈2019”Java异常第二十一章:finally不被执行的情况

结果:

“全栈2019”Java异常第二十一章:finally不被执行的情况

错误信息:

“全栈2019”Java异常第二十一章:finally不被执行的情况

文字版:

/Users/admin/Workspace/Java/Hello/src/main/Main.javaError:(16, 13) java: 无法访问的语句

从运行结果来看,由于我们的编程错误,导致的错误,错误原因就是return语句下面不能再有其他执行语句。而我们就在return语句下面放了其他执行语句:

“全栈2019”Java异常第二十一章:finally不被执行的情况

下面我们就来更改Main类:

“全栈2019”Java异常第二十一章:finally不被执行的情况

先别运行程序,先来看看代码,“throw new Exception();”下面也不能放其他执行语句,既然“throw new Exception();”和return的下面都不能放语句,那么干脆两者留其一,或者把return放在catch中,下面分别来演示这两种情况。

try代码块里面遇到return,finally会执行吗?

按照标题来更改我们的Main类:

“全栈2019”Java异常第二十一章:finally不被执行的情况

运行程序,执行结果:

“全栈2019”Java异常第二十一章:finally不被执行的情况

从运行结果来看,我们finally在try代码块里面遇到return语句照样执行。

catch代码块里面遇到return,finally会执行吗?

按照标题要求更改Main类:

“全栈2019”Java异常第二十一章:finally不被执行的情况

运行程序,执行结果:

“全栈2019”Java异常第二十一章:finally不被执行的情况

从运行结果来看,我们finally在catch代码块里面遇到return语句照样执行。

总结

  • finally在try或catch代码块里面遇到System.exit()语句不会被执行。
  • finally在try代码块里面遇到return语句照样执行。
  • finally在catch代码块里面遇到return语句照样执行。

至此,Java中finally不会被执行的情况相关内容讲解先告一段落,更多内容请持续关注。

答疑

如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。

上一章

“全栈2019”Java异常第二十章:自定义异常详解

下一章

“全栈2019”Java异常第二十二章:try-with-resources语句详解

学习小组

加入同步学习小组,共同交流与进步。

  • 方式一:关注头条号Gorhaf,私信“Java学习小组”。
  • 方式二:关注公众号Gorhaf,回复“Java学习小组”。

全栈工程师学习计划

关注我们,加入“全栈工程师学习计划”。

“全栈2019”Java异常第二十一章:finally不被执行的情况

版权声明

原创不易,未经允许不得转载!