异常处理机制】Java异常处理try-catch-finally的执行过程?

2021-11-11 09:39发布

11条回答
爱梦 - 拿来吧你
2楼 · 2021-11-11 09:40

基本执行过程如下:

1)程序首先执行可能发生异常的try语句块。

2)如果try语句没有出现异常则执行完后跳至finally语句块执行;

3)如果try语句出现异常,则中断执行并根据发生的异常类型跳至相应的catch语句块执行处理。

4)catch语句块可以有多个,分别捕获不同类型的异常。

5)catch语句块执行完后程序会继续执行finally语句块。 finally语句是可选的,如果有的话,则不管是否发生异常,finally语句都会被执行。需要注意的是即使try和catch块中存在return语句,finally语句也会执行,是在执行完finally语句后再通过return退出。


上来打杂的
3楼 · 2021-11-11 13:14

try-catch-finally程序块的执行流程以及执行结果比较复杂。

基本执行过程如下:


①程序首先执行可能发生异常的try语句块。

②、如果try语句没有出现异常则执行完后跳至finally语句块执行;

③如果try语句出现异常,则中断执行并根据发生的异常类型跳至相应的catch语句块执行处理。catch语句块可以有多个,分别捕获不同类型的异常。

④catch语句块执行完后程序会继续执行finally语句块。finally语句是可选的,如果有的话,则不管是否发生异常,finally语句都会被执行。

⑤需要注意的是即使try和catch块中存在return语句,finally语句也会执行。是在执行完finally语句后再通过return退出。



一个Ai
4楼 · 2021-11-11 15:36

第一种情况:


private static int inc() {

int i;


try {

i = 1;


return i;


} catch (NullPointerException e) {

i = 2;


return i;


} finally {

i = 3;


}


}


运行过程: 当程序执行至i=1后,准备执行下一行return之前会将i复制到最后一个本地变量表的Slot中*,简单的理解就是程序在最后执行return之前会将需要返回的值给复制到指定的用来做返回值的位置,这里就统一叫做returnValue,此时returnValue=1。然后执行finally代码,执行x=3,最后返回returnValue=1;


注意:*表示该语句摘自《深入理解JAVA虚拟机》第188页中间段落开头。


第二种情况:


private static int inc() {

int i;


try {

i = 1;


if (i == 1) {

throw new NullPointerException();


}


return i;


} catch (NullPointerException e) {

i = 2;


return i;


} finally {

i = 3;


}


}


运行过程: 当程序执行至i=1后进入if语句,然后抛出异常且被catch住,程序开始执行catch代码块,i=2,在执行下一句return i 之前,会使returnValue=2。然后执行finally代码,执行x=3,最后返回returnValue=2(此时执行的是catch中的return);


第三种情况:


private static int inc() {

int i;


try {

i = 1;


if (i == 1) {

throw new RuntimeException();


}


return i;


} catch (NullPointerException e) {

i = 2;


return i;


} finally {

i = 3;


}


}


运行过程: 当程序执行至i=1后进入if语句,然后抛出异常但是没有被catch住,程序开始执行finally代码块,i=3,finally代码块结束。由于该异常没有被catch住,程序将异常抛出给方法调用方去处理,所以代码执行结果为Exception in thread "main" java.lang.RuntimeException。


第四种情况:


private static int inc() {

int i;


try {

i = 1;


if (i == 1) {

throw new RuntimeException();


}


return i;


} catch (NullPointerException e) {

i = 2;


return i;


} finally {

i = 3;


return i;


}


}        运行过程: 当程序执行至i=1后进入if语句,然后抛出异常但是没有被catch住,程序开始执行finally代码块,i=3,然后执行return i语句之前会使returnValue=3,最后结果为3;


另外,由于finally代码块语句是在会在程序结束前全部执行完毕,因此如果在上面几种情况下finally代码块都有renturn i时返回值均为3;


总结:在每次执行完return语句上一行代码后均会先将返回值给赋予returnValue,最后返回时也是将returnValue返回。


123654
5楼 · 2021-11-12 16:50

基本执行过程如下:

     1、 程序首先执行可能发生异常的try语句块。

     2、如果try语句块没有出现异常则执行完后跳至finally语句块执行;如果try语句出现异常,则中断执行并根据发生的异常类型跳             至相应的catch语块执行处理。

     3、catch语句块可以有多个,分别捕获不同类型的异常。

     4、catch语句块执行完成后程序会继续执行finally语句块。

     5、finally语句是可选的,如果有的话,则不管是否发生异常,finally语句都会被执行。


不吃鱼的猫
6楼 · 2021-11-12 18:18

遇到异常走try,finally里面死一定会执行的,

帅帅马
7楼 · 2021-11-14 10:35

try-catch-finally程序块的执行流程以及执行结果比较复杂。基本执行过程如下:


程序首先执行可能发生异常的try语句块。如果try语句没有出现异常则执行完后跳至finally语句块执行;如果try语句出现异常,则中断执行并根据发生的异常类型跳至相应的catch语句块执行处理。catch语句块可以有多个,分别捕获不同类型的异常。catch语句块执行完后程序会继续执行finally语句块。finally语句是可选的,如果有的话,则不管是否发生异常,finally语句都会被执行。


需要注意的是即使try和catch块中存在return语句,finally语句也会执行。是在执行完finally语句后再通过return退出。


visonx
8楼 · 2021-11-15 08:52

首先执行可能发生异常的try语句块。如果try语句没有出现异常则执行完后跳至finally语句块执行;如果try语句出现异常,则中断执行并根据发生的异常类型跳至相应的catch语句块执行处理。catch语句块可以有多个,分别捕获不同类型的异常。catch语句块执行完后程序会继续执行finally语句块。finally语句是可选的,如果有的话,则不管是否发生异常,finally语句都会被执行

回答: 2021-12-17 10:29

①程序首先执行可能发生异常的try语句块。

②、如果try语句没有出现异常则执行完后跳至finally语句块执行;

③如果try语句出现异常,则中断执行并根据发生的异常类型跳至相应的catch语句块执行处理。catch语句块可以有多个,分别捕获不同类型的异常。

④catch语句块执行完后程序会继续执行finally语句块。finally语句是可选的,如果有的话,则不管是否发生异常,finally语句都会被执行。

⑤需要注意的是即使try和catch块中存在return语句,finally语句也会执行。是在执行完finally语句后再通过return退出。


py大白
9楼 · 2021-11-16 09:04

①程序首先执行可能发生异常的try语句块。

②、如果try语句没有出现异常则执行完后跳至finally语句块执行;

③如果try语句出现异常,则中断执行并根据发生的异常类型跳至相应的catch语句块执行处理。catch语句块可以有多个,分别捕获不同类型的异常。

④catch语句块执行完后程序会继续执行finally语句块。finally语句是可选的,如果有的话,则不管是否发生异常,finally语句都会被执行。

⑤需要注意的是即使try和catch块中存在return语句,finally语句也会执行。是在执行完finally语句后再通过return退出。




相关问题推荐

  • 回答 19

    1)作用不同: throw用于程序员自行产生并抛出异常; throws用于声明在该方法内抛出了异常2) 使用的位置不同: throw位于方法体内部,可以作为单独语句使用; throws必须跟在方法参数列表的后面,不能单独使用。3)内容不同: throw抛出一个异常对象,且只能是...

  • 回答 16

    异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。Java编译...

  • 回答 10

    Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java 中,每个异常都是一个对象,它是Throwable 类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获...

  • 回答 5

    OutOf MemoryError这种错误可以细分为多种不同的错误,每种错误都有自身的原因和解决办法,如下所示:java.lang.OutOfMemoryError: Java heap space 错误原因:此OOM是由于JVM中heap的最大值不满足需要。 解决方法:1) 调高heap的最大值,即-Xmx的值调大。...

  • 回答 6

    问题的根本原因是工程中某个jar包的版本(jar包编译时的所用的jdk版本)高于工程build path中jdk的版本,这个是不兼容的! 编程中遇到此异常Unsupported major.minor version 52.0(根据版本号,这里可以为其他数值,52是1.8jdk jar包与 1.8以下低版本jdk不匹配)...

没有解决我的问题,去提问