java异常处理执行顺序详解try catch finally
作者:guoyp2126 发布时间:2022-10-01 04:10:10
目录
不含return的执行顺序
finally子句
含return的执行顺序
返回类型是对象类型时值的变化
结论
不含return的执行顺序
执行顺序为执行try中代码,如果没有异常,然后执行try catch后续的代码。如:
public static void main(String[] args) {
try {
int j = 10 / 2;
System.out.println("执行try中代码!");
} catch (Exception e) {
e.printStackTrace();
System.out.println("执行catch中代码!");
}
System.out.println("执行catch后的代码!");
}
执行结果为:
如果有异常,则try中异常后的代码将不执行,开始执行catch中的代码,执行完成后,执行try catch后续的代码,示例代码如下:
public static void main(String[] args) {
try {
int j = 10 / 0;
System.out.println("执行try中代码!");
} catch (Exception e) {
e.printStackTrace();
System.out.println("执行catch中代码!");
}
System.out.println("执行catch后的代码!");
}
执行结果
发生异常语句后的代码:System.out.println(“执行try中代码!”)不再执行。
finally子句
使用try catch finally子句时,无论发生不发生异常,finally子句中的代码都是要执行,一般用于释放资源、连接等操作。
public static void main(String[] args) {
try {
int i = 8/0;
System.out.println("执行try中代码!");
} catch (Exception e) {
System.out.println("执行catch中代码!");
} finally {
System.out.println("执行finally中代码!");
}
System.out.println("执行try catch后的代码!");
}
执行try catch或try catch finally之后,执行后续的代码。
含return的执行顺序
如果不包含finally语句,在try子句和catch子句中均含有return语句,代码遇到return语句则终止代码的执行,try catch后面的语句不可能得到执行。
含有finally语句的try catch子句包含return语句执行顺序,执行finally子句,然后执行try或者catch的return语句,此时若finally语句包含return或终止运行,则try catch子句中的return语句将不执行。如:
public static void main(String[] args) {
Integer i= testReturn();
System.out.println(i);
}
public static Integer testReturn(){
try {
int i = 8/0;
System.out.println("执行try中代码!");
return 1;
} catch (Exception e) {
System.out.println("执行catch中代码!");
return 0;
}
finally {
System.out.println("执行finally中代码!");
return 3;
}
}
执行结果
如果再finally终止程序运行,则丢失返回值
public static void main(String[] args) {
Integer i= testReturn();
System.out.println(i);
}
public static Integer testReturn(){
try {
int i = 8/0;
System.out.println("执行try中代码!");
return 1;
} catch (Exception e) {
System.out.println("执行catch中代码!");
return 0;
}
finally {
System.out.println("执行finally中代码!");
System.exit(0); //退出程序,返回值丢失
}
}
执行结果如下图:
没有输出返回值
返回类型是对象类型时值的变化
返回类型如果是对象类型,则返回的是指针。此时如果finally中包含对象的炒作,注意返回值的变化。示例代码如下
创建一个Person的类
public class Person {
private String name;
private String adress;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", adress='" + adress + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAdress() {
return adress;
}
public void setAdress(String adress) {
this.adress = adress;
}
}
含有return的测试代码如下
public static void main(String[] args) {
Person person = testObjReturn();
System.out.println(person.toString());
}
public static Person testObjReturn(){
Person person = new Person();
try {
int i = 8/0;
person.setName("王小二");
person.setAdress("电子街1号");
return person;
} catch (Exception e) {
person.setName("朱小三");
person.setAdress("电子街1号");
return person;
}
finally {
person.setName("李老五");;
}
}
执行结果
结论
try catch finally带有return语句时,既可以将return语句放到try和catch中,也可以放到过程的结尾,一般建议放到结尾,便于统一管理。特别注意finally包含return语句时try、catch中的return将不再执行。尤其当返回的变量是实体对象时,finally中的语句如果对返回的变量进行修改,则将影响到返回值。
来源:https://blog.csdn.net/guoyp2126/article/details/117484471


猜你喜欢
- 需求:用户和账户一对一关系,查询账户时实现用户的延迟加载思路:根据id查询,需要延迟加载的一方1、用户实体类package com.yl.b
- 本文实例讲述了Android开发实现popupWindow弹出窗口自定义布局与位置控制方法。分享给大家供大家参考,具体如下:布局文件:主布局
- 一、在pom.xml中配置jetty插件: <build> <plugins> <p
- 下面给大家分享一小段代码给大家介绍C# 输出字符串到文本文件中,具体代码如下所示: public class WriteHelp
- 前言:今年是我的第二个 1024 了 ,和我一起大声说出来,技术宅改变世界!!!本节主要介绍的是:SpringBoot 整合阿里 Druid
- 官网下载直接打开官网:http://www.oracle.com/technetwork/java/javase/downloads/jdk
- String类型小数值转为Long类型数值分为小数和整数,当传入的类型为String,需要获取的类型为Long,这时候直接通过Long.va
- Android平台已经给我们提供了很多标准的组件,如:TextView、EditView、Button、ImageView、Menu等,还有
- 前言:如果简单地拍照片并非您应用的主要目标,那么您可能希望从相机应用中获取图片并对该图片执行一些操作。一、这就是第一种方法,比较简单,不用将
- Android 解决ScrollView嵌套CridView显示问题由于GridView是可滑动的控件,嵌套在ScrollView下时需要重
- 本文以实例形式简单讲述了C#观察者模式,分享给大家供大家参考。具体实现方法如下:现在假设有一个软件公司,每当有新产品推出,就把信息通知到一些
- 本文实例讲述了C#计算字符串相似性的方法。分享给大家供大家参考。具体如下:计算字符串相似性的办法很多,甚至最笨的办法可以挨个匹配,这里要讲的
- 本文实例讲述了Java基于外观模式实现美食天下食谱功能。分享给大家供大家参考,具体如下:一、模式定义外观模式,是软件工程师常用的一种软件设计
- 代码如下: 实现1: BasicEditor.java package swt_jface.demo5; import java.io.Bu
- 本文主要介绍了SpringBoot配置文件中的明文密码如何加密保存,读取以及对于自定义的加密算法加密的参数如何保存和读取。背景为了安全的需要
- class 参数 {
- 前言一般情况下,当我们使用 SpringDataElasticsearch 去操作 ES 时,索引名
- 一、函数式接口概念函数式接口在Java中是指:有且仅有一个抽象方法的接口。 当然接口中可以包含其他的方法(默认,静态,私有)函数式接口,即适
- 题记:由于业务的需要,需要根据模板定制pdf文档,经测试根据模板导出word成功了;但是导出pdf相对麻烦了一点。两天的研究测试java导出
- 在手机客户端尤其是Android应用的开发过程中,我们经常会接触到“硬件加速”这个词。由于操作系统对底层软硬件封装非常完善,上层软件开发者往