Java异常发生时程序的执行顺序

简介:
一些基础知识:
  1.try代码段包含可能产生例外的代码;
  2.try代码段后跟有一个或多个代码段;
  3.每个catch代码段声明其能处理的一种特定的异常并提供处理的方法;
  4.当异常发生时,程序会终止当前的流程,根据获取异常的类型去执行相应的catch代码段,有多个符合条件的catch时,只执行第一个;
  5.finally段的代码无论是否发生异常都会执行。
  6.在一个try语句块中,基类异常的捕获语句不可以写在子类异常捕获语句的上面。
  看一个例子:
/**
* @author Lansine
*
*/
public class T1 {
/**
* @param args
*/
public static void main(String[] args) {
String s = "1";
try {
s = "2";
System.out.println(s);
if (s == "2")
throw new Exception("h");
} catch (Exception e) {
s = "3";
System.out.println(s);
} finally {
s = "4";
System.out.println(s);
}
s = "5";
System.out.println(s);
}
}
  输出的结果是2,3,4,5    (这里的逗号只用于显示)。上述语句非常清楚,但是在上述结构中加上return,就变得有些复杂了,如
/**
* @author Lansine
*
*/
public class T2 {
/**
* @param args
*/
public static void main(String[] args) {
String s = "1";
try {
s = "2";
System.out.println(s);
return;
} catch (Exception e) {
s = "3";
System.out.println(s);
} finally {
s = "4";
System.out.println(s);
}
s = "5";
System.out.println(s);
}
}
输出的结果是2,4也就是说在try结构中,虽然使用了return语句强制函数返回,不再往下执行,但实现上finally中的还是执行了。但除了finally外的其它语句不再被执行。
  一个更流行的例子是:
import java.io.*;
/**
* @author Lansine
*
*/
public class Mine {
public static void main(String argv[]){
Mine m = new Mine();
try {
System.out.println(m.amethod());
} catch (Exception e) {
// TODO 自动生成 catch 块
//e.printStackTrace();
System.out.println("我知道了");
}
System.out.println("finished");
}
public int amethod()throws Exception {
try {
FileInputStream dis = new FileInputStream("Hello.txt"); // 1,抛出异常
System.out.println("异常发生之后");
} catch (Exception ex) {
System.out.println("No such file found"); // 2.catch捕捉异常,并执行
//throw new Exception("上面处理");
return -1; // 4,return 返回
} finally {
System.out.println("Doing finally"); // 3.finally一定会执行,在return之前。
}
System.out.println("在代码后面");
return 0;
}
}
  结果是:
  No such file found
  Doing finally
  -1
  finished
  如果在catch块中抛出异常,则结果为:
  No such file found
  Doing finally
  我知道了
  finished
  注意:如果异常往上抛直到main函数还没有被catch处理的话,程序将被异常终止。


最新内容请见作者的GitHub页:http://qaseven.github.io/
相关文章
|
7月前
|
人工智能 监控 安全
智慧工地解决方案,java智慧工地程序代码
智慧工地系统融合物联网、AI、大数据等技术,实现对施工现场“人、机、料、法、环”的全面智能监控与管理,提升安全、效率与决策水平。
218 2
|
5月前
|
安全 Java
Java异常处理:程序世界的“交通规则
Java异常处理:程序世界的“交通规则
367 98
|
6月前
|
存储 Java 编译器
对比Java学习Go——程序结构与变量
本节对比了Java与Go语言的基础结构,包括“Hello, World!”程序、代码组织方式、入口函数定义、基本数据类型及变量声明方式。Java强调严格的面向对象结构,所有代码需置于类中,入口方法需严格符合`public static void main(String[] args)`格式;而Go语言结构更简洁,使用包和函数组织代码,入口函数为`func main()`。两种语言在变量声明、常量定义、类型系统等方面也存在显著差异,体现了各自的设计哲学。
257 0
|
9月前
|
Java 程序员 数据库连接
我们详细地讲解一下 Java 异常及要如何处理
我是小假 期待与你的下一次相遇 ~
204 1
|
SQL Java 中间件
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
在BeetISQL 2.13.8版本中,客户使用batch insert向yashandb表插入数据并尝试获取自动生成的sequence id时,出现类型转换异常。原因是beetlsql在prepareStatement时未指定返回列,导致yashan JDBC驱动返回rowid(字符串),与Java Bean中的数字类型tid不匹配。此问题影响业务流程,使无法正确获取sequence id。解决方法包括:1) 在batchInsert时不返回自动生成的sequence id;2) 升级至BeetISQL 3,其已修正该问题。
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
搜索推荐 Java Android开发
课时146:使用JDT开发Java程序
在 Eclipse 之中提供有 JDT环境可以实现java 程序的开发,下面就通过一些功能进行演示。 项目开发流程
412 0
|
存储 Java 数据库连接
【YashanDB知识库】Java程序调用存储过程,在提取clob时报YAS-00004
【YashanDB知识库】Java程序调用存储过程,在提取clob时报YAS-00004
|
缓存 监控 算法
Java程序性能优化策略与实践
在当今软件开发领域,Java作为一种广泛应用的编程语言,其程序性能优化显得尤为重要。本文将介绍一些Java程序性能优化的策略和实践,帮助开发者提高代码执行效率、减少资源消耗,并优化用户体验。通过深入探讨各种优化技术和工具,读者将能够更好地理解和运用这些策略,有效提升Java应用程序的性能。
196 1