深入剖析Java中的各种异常处理方式
作者:zinss26914 发布时间:2022-05-29 20:20:24
1. 调试追踪代码:
public static void enterTryMethod() {
System.out.println("enter after try field");
}
public static void enterExceptionMethod() {
System.out.println("enter catch field");
}
public static void enterFinallyMethod() {
System.out.println("enter finally method");
}
2. 抛出Exception,没有finally,当catch遇上return
public static int catchTest() {
int res = 0;
try {
res = 10 / 0; // 抛出Exception,后续处理被拒绝
enterTryMethod();
return res; // Exception已经抛出,没有获得被执行的机会
} catch (Exception e) {
enterExceptionMethod();
return 1; // Exception抛出,获得了调用方法并返回方法值的机会
}
}
后台输出结果:
enter catch field
1
3. 抛出Exception,当catch体里有return,finally体的代码块将在catch执行return之前被执行
public static int catchTest() {
int res = 0;
try {
res = 10 / 0; // 抛出Exception,后续处理被拒绝
enterTryMethod();
return res; // Exception已经抛出,没有获得被执行的机会
} catch (Exception e) {
enterExceptionMethod();
return 1; // Exception抛出,获得了调用方法并返回方法值的机会
} finally {
enterFinallyMethod(); // Exception抛出,finally代码将在catch执行return之前被执行
}
}
后台输出结果:
enter catch field
enter finally method
1
4. 不抛出Exception,当finally代码块里面遇上return,finally执行完后将结束整个方法
public static int catchTest() {
int res = 0;
try {
res = 10 / 2; // 不抛出Exception
enterTryMethod();
return res; // 获得被执行的机会,但执行需要在finally执行完成之后才能被执行
} catch (Exception e) {
enterExceptionMethod();
return 1;
} finally {
enterFinallyMethod();
return 1000; // finally中含有return语句,这个return将结束这个方法,不会在执行完之后再跳回try或者catch继续执行,方法到此结束
}
}
后台输出结果:
enter after try field
enter finally method
1000
5. 不抛Exception,当finally代码块里面遇上System.exit()方法将结束和终止整个程序,而不只是方法
public static int catchTest() {
int res = 0;
try {
res = 10 / 2; // 不抛出Exception
enterTryMethod();
return res; // 获得被执行的机会,但由于finally已经终止程序,返回值没有机会被返回
} catch (Exception e) {
enterExceptionMethod();
return 1;
} finally {
enterFinallyMethod();
System.exit(0); // finally中含有System.exit()语句,System.exit()将退出整个程序,程序将被终止
}
}
后台输出结果:
enter after try field
enter finally method
6. 抛出Exception,当catch和finally同时遇上return,catch的return返回值将不会被返回,finally的return语句将结束整个方法并返回
public static int catchTest() {
int res = 0;
try {
res = 10 / 0; // 抛出Exception,后续处理将被拒绝
enterTryMethod();
return res; // Exception已经抛出,没有获得被执行的机会
} catch (Exception e) {
enterExceptionMethod();
return 1; // Exception已经抛出,获得被执行的机会,但返回操作将被finally截断
} finally {
enterFinallyMethod();
return 10; // return将结束整个方法,返回值为10
}
}
后台输出结果:
enter catch field
enter finally method
10
7. 不抛出Exception,当finally遇上return,try的return返回值将不会被返回,finally的return语句将结束整个方法并返回
public static int catchTest() {
int res = 0;
try {
res = 10 / 2; // 不抛出Exception
enterTryMethod();
return res; // 获得执行机会,但返回将被finally截断
} catch (Exception e) {
enterExceptionMethod();
return 1;
} finally {
enterFinallyMethod();
return 10; // return将结束整个方法,返回值为10
}
}
后台输出结果:
enter after try field
enter finally method
10
结论
Java的异常处理中,程序执行完try里面的代码块之后,该方法并不会立即结束,而是继续试图去寻找该方法有没有finally的代码块
如果没有finally代码块,整个方法在执行完try代码块后返回相应的值来结束整个方法
如果有finally代码块,此时程序执行到try代码块里的return一句之时并不会立即执行return,而是先去执行finally代码块里的代码
若finally代码块里没有return或没有能够终止程序的代码,程序在执行完finally代码块代码之后再返回try代码块执行return语句来结束整个方法。若 finally 代码块里有 return 或含有能够终止程序的代码,方法将在执行完 finally 之后被结束,不再跳回 try 代码块执行 return
在抛出异常的情况下,原理也是和上面的一样的,你把上面说到的 try 换成 catch 去理解就OK了。
猜你喜欢
- 正常在Java工程中读取某路径下的文件时,可以采用绝对路径和相对路径,绝对路径没什么好说的,相对路径,即相对于当前类的路径。在本地工程和服务
- 写在前面关于数据结构,Java官方其实已经帮我们写好并封装起来了,在真正需要使用的时候直接调用即可,但为了更好的理解数据结构,我会按照源码的
- 前言通过此篇文章,你将了解到:Flutter windows和Android桌面应用屏幕适配的解决方案;屏幕适配的相关知识和原理;flutt
- 1.字符串值中包含E等科学计数法,比如12E-2,需要进行转化为普通数值0.12,2.转化函数如下: private Decima
- 基于 springboot+vue的测试平台开发一、前端环境搭建在前端框架vue-element-admin这个项目中,有一个简洁轻量型的项
- 首先,你可能会见到如下提示:File encoding is disabled because .properties file (see
- 前言在实际工作中,重试机制是一个很常见的场景,比如:发送消息失败,下载网络文件失败等…,因为这些错误可能是网络波动造成
- 1、修改application.properties新建 Mapper、实体类 相应的文件夹,将不同数据源的文件保存到对应的文件夹下# te
- 缘起年前,因为项目需要进行配置的优化和架构的升级,领导给我来了个任务,让我去进行技术调研需要将配置中心的yaml配置文件里面的配置转为Jso
- 倒序拼接字符串@ApiOperation("分页查询") @GetMapping(value
- 一、前言最近自己在学习Spring boot的过程中开发了一个组件 multithreadpool-spring-boot-starter,
- 本文实例为大家分享了java指定精确小数位的具体代码,供大家参考,具体内容如下java代码:public class App2 {publi
- 汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有n个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把
- SpringBoot实践,开发社区登录模块今日份开启 发送邮件三个步骤:1、邮箱设置首先需要注册一个新浪邮箱 18215626061@sin
- 你知道String、StringBuilder、Stringbuffer的区别吗?当你创建字符串的时候,有考虑过该使用哪个吗?别急,这篇文章
- 1.使用keySet进行遍历实现步骤:(1)使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中(
- Logback 背景Logback是由log4j创始人设计的另一个开源日志组件,官方网站:http://logback.qos.ch。它当前
- MyBatis的注解实现复杂映射开发实现复杂关系映射之前我们可以在映射文件中通过配置来实现,使用注解开发后,我们可以使用@Results注解
- @RequestBody的作用@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的),所以只能发送
- 子类重新实现父类的方法称重写;重写时可以修改访问权限修饰符和返回值,方法名和参数类型及个数都不可以修改;仅当返回值为类类型时,重写的方法才可