java异常处理之try_catch_finally

看下面的一个列子:

public class TestException {
int goabl=1;
public TestException() {
} int testEx() throws Exception {
int ret = 1;
try {
ret++;
return ret;
} catch (Exception e) {
ret++;
return ret;
} finally {
ret=0;
}
} int testEx1() throws Exception {
int ret = 1;
try {
ret++;
int t=ret/(ret-2);//制造一个exception
return ret;
} catch (Exception e) {
ret++;
return ret;
} finally {
ret=0;
}
} int testEx2() throws Exception {
int ret = 1;
try {
ret++;
int t=ret/(ret-2);//制造一个exception
return ret;
} catch (Exception e) {
ret++;
return ret;
} finally {
ret=0;
return ret;
}
}
int testEx3() throws Exception {
int ret = 1;
try {
ret++;
return ret;
} catch (Exception e) {
ret++;
return ret;
} finally {
ret=0;
return ret;
}
}
int testEx4() throws Exception {
try {
goabl++;
return goabl;
} catch (Exception e) {
goabl++;
return goabl;
} finally {
goabl=0; }
} public static void main(String[] args) {
TestException testException1 = new TestException();
try {
System.out.println(testException1.testEx());
System.out.println(testException1.testEx1());
System.out.println(testException1.testEx2());
System.out.println(testException1.testEx3());
System.out.println(testException1.testEx4());
} catch (Exception e) {
e.printStackTrace();
}
}
}

程序的运行结果是:

2
3
0
0
2

如果你的答案是正确的且知道是为什么,那么下面的内容相信你也不用看了。
首先这里我就不细说java的异常处理机制,想了解的同学可以去看看java异常处理深入研究。
我们首先对try_catch_finally的执行顺序进行说明。
首先我可以很明确的告诉大家try_catch_finally的执行顺序其实很简单,首先是执行try中的 语句如果有异常就直接进入catch,最后finally一定会执行。
这样可能有人会问那为什么第一个的输出不是0呢?别急我们来一个一个说明。

testEx

try语句中没有任何异常所以catch不会执行。ret进行了一次++操作,这时程序进行了返回,在内存中会生成一个临时变量,来保存ret,也就是说ret的值赋给了一个临时变量所以,ret在finally中赋值为零并不会改变返回的值所以输出为2;

testEx1

这次我们人为的在try的语句中制造了exception这样程序会进入到catch中,所以ret被++两次,同样finally中的语句不能对返回值产生影响,所以输出为3;

testEx2

相对于testEx1我们在finally语句中加入了return语句,说以函数的返回值变成了0,这样说名我能函数的返回值实在finally执行结束后才确定的。

testEx3

同testEx2一样由于finally中加入了return语句,返回值为0;

testEx4

在这个函数中我们把操作的对象改为了全局变量,结合最后一个输出我们可以知道函数的返回结果的确是被一个临时变量接收了,所以函数返回的结果是2,但是goabl已经变为0了。

try()里面有一个return语句,那么后面的finally{}里面的code会不会被执行,什么时候执行,是在return前还是return后?

自己写了个代码测试了一下:

public static void main(String[] args) {
int i=getInt();
System.out.println(i);
} private static int getInt() {
// TODO Auto-generated method stub
try {
return 0;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
return 1;
}
}

输出的结果是1

java异常处理之try_catch_finally的更多相关文章

  1. 札记:Java异常处理

    异常概述 程序在运行中总会面临一些"意外"情况,良好的代码需要对它们进行预防和处理.大致来说,这些意外情况分三类: 交互输入 用户以非预期的方式使用程序,比如非法输入,不正当的操作 ...

  2. java异常处理(父子异常的处理)

    我当初学java异常处理的时候,对于父子异常的处理,我记得几句话“子类方法只能抛出父类方法所抛出的异常或者是其子异常,子类构造器必须要抛出父类构造器的异常或者其父异常”.那个时候还不知道子类方法为什么 ...

  3. Java 异常处理

    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用System.out ...

  4. 《转载》Java异常处理的10个最佳实践

    本文转载自 ImportNew - 挖坑的张师傅 异常处理在编写健壮的 Java 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可用.非法的输入.nul ...

  5. JAVA 异常处理机制

    主要讲述几点: 一.异常的简介 二.异常处理流程 三.运行时异常和非运行时异常 四.throws和throw关键字 一.异常简介 异常处理是在程序运行之中出现的情况,例如除数为零.异常类(Except ...

  6. Java异常处理和设计

    在程序设计中,进行异常处理是非常关键和重要的一部分.一个程序的异常处理框架的好坏直接影响到整个项目的代码质量以及后期维护成本和难度.试想一下,如果一个项目从头到尾没有考虑过异常处理,当程序出错从哪里寻 ...

  7. 深入理解java异常处理机制

       异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的 ...

  8. Java提高篇——Java 异常处理

    异常的概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用Syst ...

  9. java异常处理的设计

    有一句这样话:一个衡量Java设计师水平和开发团队纪律性的好方法就是读读他们应用程序里的异常处理代码. 本文主要讨论开发Java程序时,如何设计异常处理的代码,如何时抛异常,捕获到了怎么处理,而不是讲 ...

随机推荐

  1. 使用Redis分布式锁实现主备

    使用Redis分布式锁实现集群的主备 最近工作中遇到一个问题,我们会调用业务部门提供的HTTP接口获取所有的音视频任务信息,这些任务会被分发到各个机器节点进行处理.有两个方案: 方案一 为每台机器编号 ...

  2. Spring boot Sample 001之spring-boot-begin-hello

    一.环境 1.1.Idea 2020.1 1.2.JDK 1.8 二.目的 初识Spring Boot 三.步骤 3.1.点击File -> New Project -> Spring I ...

  3. SpringCloud Netflix (六):Config 配置中心

    ------------恢复内容开始------------ SpringCloud Config 配置中心 Config 配置中心 Spring Cloud Config为分布式系统中的外部化配置提 ...

  4. 如何选出适合自己的管理Helm Chart的最佳方式?

    本文转载自Rancher Labs 无论你喜欢与否,你都不得不承认Helm是管理Kubernetes应用程序独一无二的工具,你甚至可以通过不同的方式使用它. 在Helm的使用过程中,我们注意到有几个问 ...

  5. Java实现 LeetCode 661 图片平滑器(暴力)

    661. 图片平滑器 包含整数的二维矩阵 M 表示一个图片的灰度.你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元 ...

  6. Java实现 蓝桥杯 算法训练 数字游戏

    试题 算法训练 数字游戏 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个1-N的排列a[i],每次将相邻两个数相加,得到新序列,再对新序列重复这样的操作,显然每次得到的序列 ...

  7. java实现滑动解锁

    滑动解锁是智能手机一项常用的功能.你需要在3x3的点阵上,从任意一个点开始,反复移动到一个尚未经过的"相邻"的点.这些划过的点所组成的有向折线,如果与预设的折线在图案.方向上都一致 ...

  8. 「从零单排canal 01」 canal 10分钟入门(基于1.1.4版本)

    1.简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据 订阅 和 消费.应该是阿里云DTS(Data Transfer Servi ...

  9. vs2019离线下载安装包

    官方的离线安装说明-->点击打开 1.下载 vs2019引导程序 ,选择你所需的版本下载,我选择了企业版 vs_enterprise__184447765.1558180718.exe 2.设置 ...

  10. android在service中stopself遇到的问题

    在service的oncreate中直接调用stopservice停止自己,依然会执行onstartcommand方法后,最后才调用ondestory方法