java异常处理-finally中使用return和throw语句
java异常语句中的finally块通常用来做资源释放操作,如关闭文件、关闭网络连接、关闭数据库连接等。正常情况下finally语句中不应该使用return语句也不应该抛出异常,以下讨论仅限于java语言设计本身,正常编码时应避免。
finally块中使用return会覆盖method的返回值
以下代码的返回值为:1
public static int div(){
try {
return ;
}catch (ArithmeticException e){
System.out.println("catch in div");
return ;
}
finally {
System.out.println("finally in div");
return ;
}
}
以下代码的返回值同样是:1
public static int div(){
try {
return /;
}catch (ArithmeticException e){
System.out.println("catch in div");
return ;
}
finally {
System.out.println("finally in div");
return ;
}
}
finally块中使用return会抑制异常的冒泡传输
即:只要finally中使用了return语句,调用者便认为该方法正常返回
以下代码的输出为
catch in div
finally in div
catch in adapter
finally in adapter
/**
* Created by Administrator on 2017/11/27.
*/ public class Test { public static void main(String[] args) {
adapter();
} public static void adapter() {
try {
div();
} catch (ArithmeticException e) {
System.out.println("catch in adapter");
} finally {
System.out.println("finally in adapter");
}
} public static int div() {
try {
int a = / ;
return a;
} catch (ArithmeticException e) {
System.out.println("catch in div");
throw e; // 重新将异常抛出给调用者
} finally {
System.out.println("finally in div");
}
}
}
但如果在 div 的finally块中添加了return语句
public static int div(){
try {
int a = /;
return a;
}catch (ArithmeticException e){
System.out.println("catch in div");
throw e; // 重新将异常抛出给调用者,但是抛出会被忽略
}
finally {
System.out.println("finally in div");
return 1;
}
}
则代码的输出为
catch in div
finally in div
finally in adapter
即:finally块中的return语句会阻止异常的栈调用传输,使caller认为该方法已经正常返回
finally块中的throw语句会覆盖try和catch语句中的异常
以下代码
/**
* Created by Administrator on 2017/11/27.
*/ public class Test { public static void main(String[] args) {
adapter();
} public static void adapter() {
try {
div();
} catch (Exception e) {
System.out.println(String.format("catch in adapter: %s",e.getMessage()));
} finally {
System.out.println("finally in adapter");
}
} public static int div() throws Exception{
try {
int a = / ;
return a;
} catch (ArithmeticException e) {
System.out.println("catch in div");
throw new Exception("Exception in div"); // 抛出新的异常
} finally {
System.out.println("finally in div");
throw new Exception("Exception in Finally"); // 抛出新的异常
}
}
}
输出是:
catch in div
finally in div
catch in adapter: Exception in Finally
finally in adapter
即,catch块中抛出的异常北finally块抛出的异常替换了
修改div方法为
public static int div() throws Exception{
try {
int a = / ;
return a;
} finally {
System.out.println("finally in div");
throw new Exception("Exception in Finally"); // 抛出新的异常
}
}
输出为:
finally in div
catch in adapter: Exception in Finally
finally in adapter
即,try块中捕获的异常北finally块抛出的异常替换
finally块和普通代码块一样,无法同时使用return语句和throw语句,因为无法通过编译
java异常处理-finally中使用return和throw语句的更多相关文章
- 错误处理之try、catch、finally中的return、throw执行顺序。
今天遇到一个让人无语的代码块 try { bilSheetService.syncUser(bilWebseviceLog, userId, optType); }catch (Exception e ...
- Java异常处理场景中不同位置的返回值详细解析
Java 异常处理中的返回值在不同位置不同场景下是有一些差别的,这里需要格外注意 具体分以下两种场景: 1 finally语句块没有return语句,即当代码执行到try或者catch语句块中的ret ...
- JAVA异常处理分析(中)
在使用java异常处理机制时候我们会发现有些异常抛出后可以不需要进行抓取处理,而有些异常必须要进行抓取处理,这是个什么情况呢? 设计理念猜想: 有一些场景的异常,是可以不需要处理或是经常不会 ...
- Java异常处理-----程序中的异常处理.启蒙
1.当除数是非0,除法运算完毕,程序继续执行. 2.当除数是0,程序发生异常,并且除法运算之后的代码停止运行.因为程序发生异常需要进行处理. class Demo { public static vo ...
- Java将文件中的内容转换为sql语句(和并发定时读取文件)
数据文件内容data.txt {USER_TYPE=1,CREATE_USER=ZHANG,UPDATE_USER=li,OPER_NUM=D001,SRC=2,UPDATE_TIME=2018-11 ...
- 2017.10.28 针对Java Web应用中错误异常处理方法的运用
针对Java Web应用中错误异常处理方法的运用 在javaweb中其异常都需要对Checked Exception之下的Exception进行继承,并且有选择地对发生的错误和异常进行处理.Java同 ...
- Java中try catch finally语句中含return语句的执行情况总结-编程陷阱
前言:有java编程基础的人对java的异常处理机制都会有一定了解,而且可能感觉使用起来也比较简单,但如果在try catch finally语句块中遇到return语句,开发者可能就会遇到一些逻辑问 ...
- Java提高篇——Java 异常处理
异常的概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误java.lang.Error:如果你用Syst ...
- java中的finally详解(finally中没有return i,却有i=XX)
问题分析 首先来问大家一个问题:finally 语句块一定会执行吗? 很多人都认为 finally 语句块是肯定要执行的,其中也包括一些很有经验的 Java 程序员.可惜并不像大多人所认为的那样,对 ...
随机推荐
- iTerm的安装以及配置Oh My Zsh
iTerm说简单点就是Windows的命令提示符,可能说这个大家感觉没用过,其实也就是人们经常使用CMD,相当于苹果的终端,但是比自带的终端强大多了. 本文就是简单的说一下安装和简单的配置过程. 首先 ...
- allure2 report+ jenkins 使用
物色了一个挺漂亮的报告生成插件 ——allure. 下面介绍一下这个报告的使用. 1. 添加依赖 <dependencies> <!-- https://mvnrepository. ...
- NO---20 文件上传
文件上传是我们会经常用到的一个业务,其实在h5中新增了FormData的对象,用它来提交表单,并且可以提交二进制文件,所以今天就写写文件上传,希望可以对大家有帮助 FormData 上传文件实例 首先 ...
- hover时显示可跟随鼠标移动的浮动框,运用函数节流与去抖进行优化
在很多笔试面试题中总能看到js函数去抖和函数节流,看过很多关于这两者的讨论,最近终于在一个需求中使用了函数去抖(debounce)和函数节流(throttle). 需要完成的效果是,鼠标在表格的单元格 ...
- Linux(Contos7.5)环境搭建之Gitblit安装(三)
1.yum安装git(这一步暂时不清楚是否必要,因为在window上搭建并不需要)
- 9.Hive Metastore Administration
前言metastore参数metastore的基本参数metastore的额外参数客户端参数使用zk自动发现mestastore启动hive metastore服务 前言 本节讲metastore相关 ...
- HDU 1556 Color the ball (一维树状数组,区间更新,单点查询)
中文题,题意就不说了 一开始接触树状数组时,只知道“单点更新,区间求和”的功能,没想到还有“区间更新,单点查询”的作用. 树状数组有两种用途(以一维树状数组举例): 1.单点更新,区间查询(即求和) ...
- centos7安装oracle的一些问题
在配置监听的时候尝试了很多次都是不能创建,最后将 /data/oracle/product/11.2.0/db_1/network/admin目录下的listener.ora和tnsname.ora两 ...
- UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 0: ordinal not in range(128)的解决
在用爬虫爬取网络小说的时候出现该问题. 估计是字符格式转换格式的错误. 暂时无法解决,搜索了其他博主的解决方案. 以下两个方案靠谱: <一>适用于全篇 import sys default ...
- sublime编写markdownm
sublime编写markdownm 以前用有道云笔记,找了半天更改字体大小,结果还找不 到,那个字实在是太小了,像我这种有强迫症的患者,实 在受不了简约风格的有道云,所以上网找了与和诺插件并 受到一 ...