文档章节

java异常体系---不要在finally块中使用return、throw

四月李
 四月李
发布于 2017/01/13 10:55
字数 442
阅读 13
收藏 0

在finally块中使用return、throw,会导致编译告警:finally block does not complete normally。

情况一:finally块中没retrun、throw

复制代码

public static void method_1() {
    try {
        System.out.println("try block run");
        throw new Exception("try block 异常");
    } finally {
        System.out.println("finally block run");
    }
}

public static void method_2() {
    try {
        System.out.println("try block run");
    } catch (Exception e) {
        System.out.println("catch block run");
        throw new Exception("catch block 异常了!");
    } finally {
        System.out.println("finally block run");
    }
}

复制代码

 说明:程序报错,Unhandled exception type Exception。此时编译器会检查try块、catch块中的非运行时异常。

情况二:finally块中有retrun或者throw

复制代码

public static void method_1() {
    try {
        System.out.println("try block run");
        throw new Exception("try block 异常");
    } finally {
        System.out.println("finally block run");
        return;
    }
}
程序运行结果:try block run   》》  finally block run

public static void method_2(){
    try{
        System.out.println("try block run");   
    }catch (Exception e) {
        System.out.println("catch block run");
        throw new Exception("catch block 异常了!");
    }finally{
        System.out.println("finally block run");
        throw new RuntimeException("finally block 异常了!");
    }    
}
程序运行结果:try block run   》》  finally block run  》》  finally block 异常了!

复制代码

说明:程序告警,finally block does not complete normally。此时编译器不会检查try块、catch块中的非运行时异常。

JVM不会再去捕获try块、catch块中的异常,而是得到(使用return时)finally块的返回值或者(使用throw时)finally块中抛出的异常。

结论:

当在finally块中使用return、throw时,编译器不会再对try、catch块中的非运行时异常进行检查,JVM不会再去捕获try块、catch块中的异常,程序的输出以finally块为准,即finally块的返回值或者finally块中抛出的异常。

当在try块或catch块中遇到return语句时,finally块将在方法返回之前被执行。finally块中的return语句会覆盖try块、catch块中的return语句。合理的做法是在 finally 块之后使用return语句。

本文转载自:http://www.cnblogs.com/curious-xdb/articles/5897325.html

四月李
粉丝 16
博文 59
码字总数 50238
作品 0
成都
程序员
私信 提问
《疯狂Java讲义》学习笔记(十)异常处理

0、Java的异常体系 1、异常概述 异常机制已经成为判断一门编程语言是否成熟的标准,目前主流的编程语言都提供了成熟的异常机制,增加了异常处理机制后的程序有更好的容错性,更加健壮 Java的...

fairy1674
2018/11/22
13
0
Java程序员从笨鸟到菜鸟之(十二)java异常处理机制

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

长平狐
2012/11/12
191
0
Java 复习 —— 异常处理

前言 异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误...

learn_more
2015/08/21
109
0
深入理解Java异常处理机制

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

止静
2014/08/30
176
0
【Java】疯狂Java基础(二)——final, finally, finalize 的区别

一、前言 这次说说final、finally、finalize这三者的区别,其实对这三者有了解的程序员,基本都知道,他们三个之间没有毛线关系。就是因为名字相似,其他的什么也没有。 二、final final可以...

kisscatforever
2018/03/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

vue中eventBus的使用

使用场景: 1、兄弟组件的通信,父子组件的通信 2、不同路由的通信 针对兄弟组件的通信,父子组件的通信 新建bus.js文件 import Vue from 'vue' var bus = new Vue() export default bus 在需...

tianyawhl
16分钟前
4
0
C# DBHelper

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.SqlClient;using System.Windows.Forms;namesp......

vga
18分钟前
3
0
Spring Boot中@ConditionalOnProperty使用详解

在Spring Boot的自动配置中经常看到@ConditionalOnProperty注解的使用,本篇文章带大家来了解一下该注解的功能。 Spring Boot中的使用 在Spring Boot的源码中,比如涉及到Http编码的自动配置...

程序新视界
20分钟前
6
0
centos7下安装mysql(完整配置)

https://blog.csdn.net/baidu_32872293/article/details/80557668

为何不可1995
22分钟前
3
0
如何从零到一设计一个MQ消息队列

消息队列整体设计思路 主要是设计一个整体的消息被消费的数据流。 这里会涉及到:消息生产Producer、Broker(消息服务端)、消息消费者Consumer。 1.Producer(消息生产者):发送消息到Broker。...

一只会编程的狼
28分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部