一.结论

这些结论你可能从未听说过,但其正确性是毋庸置疑的,不妨先看看:

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异常处理机制的秘密的更多相关文章

  1. JAVA 异常处理机制

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

  2. Java 异常处理机制和集合框架

    一.实验目的 掌握面向对象程序设计技术 二.实验环境 1.微型计算机一台 2.WINDOWS操作系统,Java SDK,Eclipse开发环境 三.实验内容 1.Java异常处理机制涉及5个关键字:t ...

  3. java异常处理机制 (转载)

    java异常处理机制 本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C ...

  4. Java异常处理机制 —— 深入理解与开发应用

    本文为原创博文,严禁转载,侵权必究! Java异常处理机制在日常开发中应用频繁,其最主要的不外乎几个关键字:try.catch.finally.throw.throws,以及各种各样的Exceptio ...

  5. 如何正确使用Java异常处理机制

    文章来源:leaforbook - 如何正确使用Java异常处理机制作者:士别三日 第一节 异常处理概述 第二节 Java异常处理类 2.1 Throwable 2.1.1 Throwable有五种构 ...

  6. 【转】深入理解java异常处理机制

    深入理解java异常处理机制 ; int c; for (int i = 2; i >= -2; i--) { c = b / i; System.out.println("i=&qu ...

  7. Java异常处理机制及两种异常的区别

    java异常处理机制主要依赖于try,catch,finally,throw,throws五个关键字.   try 关键字后紧跟一个花括号括起来的代码块,简称try块.同理:下面的也被称为相应的块. ...

  8. java异常处理机制详解

    java异常处理机制详解 程序很难做到完美,不免有各种各样的异常.比如程序本身有bug,比如程序打印时打印机没有纸了,比如内存不足.为了解决这些异常,我们需要知道异常发生的原因.对于一些常见的异常,我 ...

  9. Java异常处理机制 try-catch-finally 剖析

    Java拥有着强大的异常处理机制,最近初步学习了下,感觉内容还是挺多的,特此来将自己的理解写出来与大家分享. 一. 在Java代码code中,由于使用Myeclipse IDE,可以自动提醒用户哪里有 ...

随机推荐

  1. 为什么JAVA要提供 wait/notify 机制?是为了避免轮询带来的性能损失

    wait/notify  机制是为了避免轮询带来的性能损失. 为了说清道理,我们用“图书馆借书”这个经典例子来作解释. 一本书同时只能借给一个人.现在有一本书,图书馆已经把这本书借了张三. 在简单的s ...

  2. linux分区之gpt(大于2T的分区)

    1.文件系统限制: ext3块尺寸 最大文件尺寸 最大文件系统尺寸1KiB  16GiB  2TiB2KiB  256GiB  8TiB4KiB  2TiB  16TiB8KiB  16TiB  32 ...

  3. Ubuntu 16.04安装Git及GUI客户端

    1.通过APT源安装Git命令行工具 这里不建议通过源码进行安装,增加复杂程度,且最新版本的Git在各个方面都会修复,不至于出现不能用的状态. sudo add-apt-repository ppa: ...

  4. Super Star(最小球覆盖)

    Super Star http://poj.org/problem?id=2069 Time Limit: 1000MS   Memory Limit: 65536K Total Submission ...

  5. C#中货币类型和数值类型、字符串类型的转化

    1.定义textbox的数据 private void Form1_Load(object sender, EventArgs e) { this.textBox1.Text = String.For ...

  6. node.js压缩版 Windows安装

    1.下载 下载地址:https://nodejs.org/zh-cn/download/ 选择相应的版本下载 2.解压缩 将文件解压到要安装的位置,并新建两个目录 node-global :npm全局 ...

  7. php Pthread 多线程 (四) 共享内存

    有些时候我们希望在多个线程中共享一些需要的数据,我们可以使用shmop扩展. <?php class Count extends Thread { private $name = ''; pub ...

  8. linux安装php 按 apache方式

    1.下载php源码包 在 http://php.net/downloads.php 下载 php-5.6.11.tar.gz 2.进入到php源码包中,configure > ./configu ...

  9. phalcon框架安装

    Phalcon学习笔记 - 安装 原创 2014年10月23日 12:20:33 标签: phalcon / phalcon安装 5014 如何学习一个新的框架 1  明白工作原理 2  知道核心思想 ...

  10. PAT 1047 编程团体赛(代码)

    1047 编程团体赛(20)(20 分) 编程团体赛的规则为:每个参赛队由若干队员组成:所有队员独立比赛:参赛队的成绩为所有队员的成绩和:成绩最高的队获胜. 现给定所有队员的比赛成绩,请你编写程序找出 ...