java 抛出异常与finally的混用对于语句块的执行顺序的影响

代码如下:

 1 package test1;
 2
 3 public class EmbededFinally {
 4
 5
 6     public static void main(String args[]) {
 7
 8         int result;
 9
10         try {
11
12             System.out.println("in Level 1");
13
14
15              try {
16
17                 System.out.println("in Level 2");
18   // result=100/0;  //Level 2
19
20                  try {
21
22                      System.out.println("in Level 3");
23
24                      result=100/0;  //Level 3
25
26                 }
27
28                 catch (Exception e) {
29
30                     System.out.println("Level 3:" + e.getClass().toString());
31
32                 }
33
34
35                 finally {
36
37                     System.out.println("In Level 3 finally");
38
39                 }
40
41
42                 // result=100/0;  //Level 2
43
44
45                 }
46
47             catch (Exception e) {
48
49                  System.out.println("Level 2:" + e.getClass().toString());
50
51              }
52              finally {
53
54                 System.out.println("In Level 2 finally");
55
56              }
57
58             // result = 100 / 0;  //level 1
59
60         }
61
62         catch (Exception e) {
63
64             System.out.println("Level 1:" + e.getClass().toString());
65
66         }
67
68         finally {
69
70              System.out.println("In Level 1 finally");
71
72         }
73
74     }
75
76 }

运行结果如上图:

对于代码的分析: 前三行输出结果,是try中三个正常的输出语句,并且在最后抛出了一个by zero错误。然后用catch语句捕捉了这个语句,并且输出了语句。但我们会发现后面的catch语句都没有被执行,而是直接执行了finally语句,说明finally语句改变了代码中输出的逻辑。但具体的原因尚不明确。

最后,提出一个小问题:finally语句一定会执行吗?

我姑且自己回答一下,如果在finally之前使用了exit,退出了程序,那么finally语句就不会执行了。

比如,我们用以下的测试代码:

 1 package test1;
 2 public class SystemExitAndFinally {
 3
 4
 5     public static void main(String[] args)
 6     {
 7
 8         try{
 9
10
11             System.out.println("in main");
12
13             throw new Exception("Exception is thrown in main");
14
15                     //System.exit(0);
16
17
18         }
19
20         catch(Exception e)
21
22             {
23
24             System.out.println(e.getMessage());
25
26             System.exit(0);
27
28         }
29
30         finally
31
32         {
33
34             System.out.println("in finally");
35
36         }
37
38     }
39
40
41 }

运行结果如图:

我们可以看到,finally后的语句并没有被输出,而在退出程序前的语句并没有任何影响。

原文地址:https://www.cnblogs.com/wushenjiang/p/11762084.html

时间: 2024-11-10 13:40:45

java 抛出异常与finally的混用对于语句块的执行顺序的影响的相关文章

52.finally语句块不执行的唯一情况

import java.util.Scanner; /** * 使用try-catch-finally进行异常处理. */ public class Test4 { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.print("请输入被除数:"); try { int num1 = in.nextInt(); System.out.print("请

Finally语句块的执行

一.finally语句块是否一定执行? Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过试验验,至少以下有两种情况下finally语句是不会被执行的: (1).异常捕获机制finally块与try和catch块是关联的,既然是关联的如果try...catch...finally语句逻辑上达不到没有被 执行,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语

Java(静态)变量和(静态)代码块的执行顺序

本文讨论Java中(静态)变量.(静态)代码块的执行顺序 首先创建3个类: 1.Foo类,用于打印变量 public class Foo { public Foo(String word) { System.out.println(word); } } 2.Parent类 public class Parent { static Foo FOO = new Foo("Parent's static parameter"); Foo foo = new Foo("Parent'

Oracle中Select语句完整的执行顺序

oracle Select语句完整的执行顺序: 1.from 子句组装来自不同数据源的数据: 2.where 子句基于指定的条件对记录行进行筛选: 3.group by子句将数据划分为多个分组: 4.使用聚集函数进行计算: 5.使用having子句筛选分组: 6.计算所有的表达式: 7.使用order by对结果集进行排序.

sql中select语句的逻辑执行顺序

下面是SELECT语句的逻辑执行顺序: FROMONJOINWHEREGROUP BYWITH CUBE or WITH ROLLUPHAVINGSELECTDISTINCTORDER BYTOP MICROSOFT指出,SELECT语句的实际物理执行顺序可能会由于查询处理器的不同而与这个顺序有所出入. GROUP BY和HAVING 不能使用别名,就是因为他们先于select执行.

【Oracle】SQL 中Select语句完整的执行顺序

SQL Select语句完整的执行顺序: 1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将数据划分为多个分组: 4.使用聚集函数进行计算: 5.使用having子句筛选分组: 6.计算所有的表达式: 7.select 的字段: 8.使用order by对结果集进行排序. SQL语言不同于其他编程语言的最明显特征是处理代码的顺序.在大多数据库语言中,代码按编码顺序被处理.但在SQL语句中,第一个被处理的子句式FROM,而不是

Java和Android中,代码块、static静态代码块的执行顺序

Java和Android中,代码块.static静态代码块的执行顺序有没有什么区别呢. Java 先来个简单的例子 Main.java: public class Main { static int a = 1; static { System.out.println(a); } static { a = 2; } public static void main(String[] args) { System.out.println("Hello World!"); System.ou

SQL Select语句完整的执行顺序

SQL Select语句完整的执行顺序: 1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将数据划分为多个分组: 4.使用聚集函数进行计算: 5.使用having子句筛选分组: 6.计算所有的表达式: 7.select 的字段:8.使用order by对结果集进行排序.SQL语言不同于其他编程语言的最明显特征是处理代码的顺序.在大多数据库语言中,代码按编码顺序被处理.但在SQL语句中,第一个被处理的子句式FROM,而不是第一

夯实Java基础系列7:一文读懂Java 代码块和执行顺序

目录 Java中的构造方法 构造方法简介 构造方法实例 例 1 例 2 Java中的几种构造方法详解 普通构造方法 默认构造方法 重载构造方法 java子类构造方法调用父类构造方法 Java中的代码块简介 Java代码块使用 局部代码块 构造代码块 静态代码块 Java代码块.构造方法(包含继承关系)的执行顺序 参考文章 微信公众号 Java技术江湖 个人公众号:黄小斜 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github