文档章节

Java异常处理(try、catch、finally使用)

tomcater
 tomcater
发布于 2016/04/18 16:58
字数 1156
阅读 69
收藏 8

直接上代码,先贴下面测试需要调用的方法:

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");  
}

1. 抛出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

2. 抛出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

3. 不抛出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

4. 不抛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

5. 抛出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

6. 不抛出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了。

 

本文转载自:http://www.blogjava.net/fancydeepin/archive/2012/07/08/382508.html

tomcater
粉丝 4
博文 43
码字总数 55169
作品 0
海淀
程序员
私信 提问
06-《深度拆解JVM》之JVM是如何处理异常的?

一、问题引入 今天我们来讨论下 Java 虚拟机的异常处理。众所周知,异常处理的两大组成要素是抛出异常和捕获异常。这两大要素共同实现程序控制流的非正常转移。 抛出异常可分为显式和隐式两种...

飞鱼说编程
2018/09/28
61
2
java 高级编程之深入理解异常处理机制

引子 try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解。不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单、听话。...

键盘上跳舞
2017/07/13
357
0
深入理解Java异常处理机制

引子 try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解。不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单、听话。...

止静
2014/08/30
169
0
java那些事(八)之深入理解java异常处理机制

引子 try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解。不过,我亲自体验的“教训” 告诉我,这个东西可不是想象中的那么简单、听话...

thomas1111
2014/06/17
135
0
Java程序员从笨鸟到菜鸟之(十二)java异常处理机制

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...el...

长平狐
2012/11/12
155
0

没有更多内容

加载失败,请刷新页面

加载更多

将key=value转成对象形式

var params = {};testParan.split(',').forEach(item =>{ var tmpArr = item.split('='); Vue.set(params, tmpArr[0].trim(), tmpArr[1].trim());});Vue.set(params, 'sql', sql);......

沉迷代码我爱学习
19分钟前
3
0
什么是分立器件

  分立器件被广泛应用到消费电子、计算机及外设、网络通信,汽车电子、led显示屏等领域。   半导体产业中有两大分支:集成电路和分立器件。   集成电路   集成电路(integrated circ...

仙溪
29分钟前
4
0
kibana rpm安装

https://www.elastic.co/guide/en/kibana/6.2/rpm.html 下载对应的版本wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.4-x86_64.rpm 安装 rpm -ivh kibana-6.2.4-x86_64......

看的最远的地方
32分钟前
3
0
高防CDN相比较于高防服务器,为何更加稳定?

对于DDoS攻击,那些已经做过网站、平台的人应该知道,DDoS攻击是非常可怕的,因为这种攻击本质上不能防御,或者DDoS攻击只能被减轻,不能完全消除。DDoS,意思是“分布式拒绝服务”。它是一种...

云漫网络Ruan
33分钟前
4
0
线程SuspendThread() ResumeThread()的使用

SuspendThread():挂起线程 If the function succeeds, the return value is the thread's previous suspend count; otherwise, it is (DWORD) -1. ResumeThread():启动线程 If the functio......

rainbowcode
33分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部