Java异常处理机制的秘密
一.结论
这些结论你可能从未听说过,但其正确性是毋庸置疑的,不妨先看看:
1.catch中throw不一定能抛回到上一层,因为finally中的return会抑制这个throw
2.finally中throw一定能抛回上一层,因为此时其后的return不会被执行到(throw中断了正常的顺序流)
3.在try/catch中return并不会直接返回上一层,而是先执行finally再返回
二.一段小程序
package ayqy;
public class catchEx {
/**
* 测试Java异常处理机制<br />
* 结论:<br />
* 1.catch中throw不一定能抛回到上一层,因为finally中的return会抑制这个throw<br />
* 2.finally中throw一定能抛回上一层,因为此时其后的return不会被执行到(throw中断了正常的顺序流)<br />
* 3.在try/catch中return并不会直接返回上一层,而是先执行finally再返回
*/
public static void main(String[] args){
// TODO Auto-generated method stub
try{
System.out.println("Main_try");
fun();
}catch(Exception e){
System.out.println("Main_catch");
}finally{
System.out.println("Main_finally");
}
}
public static void fun() throws Exception
{
try{
System.out.println("Fun_try");
int a = 3 / 0;
}catch(Exception ex){
System.out.println("Fun_catch");
throw ex;//#1
}finally{
System.out.println("Fun_finally");
return;//#2
}
}
三.说明
http://hygj0113ldp.blog.163.com/blog/static/12253543620098308103964/
这个问题来自上面的链接博文,但原作者并没有给出合理的解释
原问题:
当 catch中抛出了未捕获的异常ex 并且 finally中有return 时,我们发现这个ex并不能被抛出到上一层方法,这是为什么呢?
实验:
1.直接运行上面的程序
结果是:
Fun_catch
Fun_finally
Main_finally
正如问题描述里写的,为什么没有输出Main_catch?
2.注释#1语句
结果不变,也就是说,抛不抛异常效果一样,换言之,这个异常并没有成功地抛出去
3.取消注释#1语句,注释#2语句
结果是:
Main_try
Fun_try
Fun_catch
Fun_finally
Main_catch
Main_finally
和我们预想的结果一致,那么不难得出结论:
finally中的return能够抑制(或着说掩盖、消费)在此之前抛出的异常(try/catch中的未捕获异常)
Java异常处理机制的秘密的更多相关文章
- JAVA 异常处理机制
主要讲述几点: 一.异常的简介 二.异常处理流程 三.运行时异常和非运行时异常 四.throws和throw关键字 一.异常简介 异常处理是在程序运行之中出现的情况,例如除数为零.异常类(Except ...
- Java 异常处理机制和集合框架
一.实验目的 掌握面向对象程序设计技术 二.实验环境 1.微型计算机一台 2.WINDOWS操作系统,Java SDK,Eclipse开发环境 三.实验内容 1.Java异常处理机制涉及5个关键字:t ...
- java异常处理机制 (转载)
java异常处理机制 本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C ...
- Java异常处理机制 —— 深入理解与开发应用
本文为原创博文,严禁转载,侵权必究! Java异常处理机制在日常开发中应用频繁,其最主要的不外乎几个关键字:try.catch.finally.throw.throws,以及各种各样的Exceptio ...
- 如何正确使用Java异常处理机制
文章来源:leaforbook - 如何正确使用Java异常处理机制作者:士别三日 第一节 异常处理概述 第二节 Java异常处理类 2.1 Throwable 2.1.1 Throwable有五种构 ...
- 【转】深入理解java异常处理机制
深入理解java异常处理机制 ; int c; for (int i = 2; i >= -2; i--) { c = b / i; System.out.println("i=&qu ...
- Java异常处理机制及两种异常的区别
java异常处理机制主要依赖于try,catch,finally,throw,throws五个关键字. try 关键字后紧跟一个花括号括起来的代码块,简称try块.同理:下面的也被称为相应的块. ...
- java异常处理机制详解
java异常处理机制详解 程序很难做到完美,不免有各种各样的异常.比如程序本身有bug,比如程序打印时打印机没有纸了,比如内存不足.为了解决这些异常,我们需要知道异常发生的原因.对于一些常见的异常,我 ...
- Java异常处理机制 try-catch-finally 剖析
Java拥有着强大的异常处理机制,最近初步学习了下,感觉内容还是挺多的,特此来将自己的理解写出来与大家分享. 一. 在Java代码code中,由于使用Myeclipse IDE,可以自动提醒用户哪里有 ...
随机推荐
- poj1611(并查集简单应用)
题目链接:http://poj.org/problem?id=1611 思路: 显然是一个并查集的题,很简单,只要将一个group中的学生并在一起,最后遍历1到n-1,看有多少学生的祖先与0的祖先相等 ...
- Python3 chr() 函数
Python3 chr() 函数 Python3 内置函数 描述 chr() 用一个整数作参数,返回一个对应的字符. 语法 以下是 chr() 方法的语法: chr(i) 参数 i -- 可以是 10 ...
- day4:vcp考试
Q61. Which two statements are true regarding Virtual SAN Fault Domains? (Choose two.)A. They enable ...
- 23-新建maven 项目
1. 新建:Maven Project; 2. 配置项 bulid path, 添加tomcat: 3. 新建一个sources文件夹: srt/test/resourses 4.配置她的默认输出路径 ...
- css布局---各种居中
居中是我们使用css来布局时常遇到的情况.使用css来进行居中时,有时一个属性就能搞定,有时则需要一定的技巧才能兼容到所有浏览器,本文就居中的一些常用方法做个简单的介绍. 注:本文所讲方法除了特别说明 ...
- 基于KVM的qemu中宿主机和虚拟机间的通信
qga是一个运行在虚拟机内部的普通应用程序(可执行文件名称默认为qemu-ga,服务名称默认为qemu-guest-agent),其目的是实现一种宿主机和虚拟机进行交互的方式,这种方式不依赖于网络,而 ...
- Codeforces 599B. Spongebob and Joke 模拟
B. Spongebob and Joke time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- conn not captured
线程 和 事件中 变量 not captured 把变量定义为 static 或者添加为全局变量(放在main之前)
- [SoapUI] 配置默认环境的properties
<Envs> <Env id="Live,Default environment"> <Project> <CusProperty nam ...
- 1. Install Git and GitExtension
Install Git Step 1: Run