深入剖析Java中的各种异常处理方式

1. 调试追踪代码:

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

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

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

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

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

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

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

(0)

相关推荐

  • java异常机制分析

    本文实例分析了Java的异常机制,分享给大家供大家参考.相信有助于大家提高大家Java程序异常处理能力.具体分析如下: 众所周知,java中的异常(Exception)机制很重要,程序难免会出错,异常机制可以捕获程序中的错误,用来提高程序的稳定性和健壮性. java中的异常分为Checked Exception(非Runtime Exception)和UnChecked Exception(Runtime Exception),所有的异常类都直接或间接的继承Exception.Exception

  • 浅谈JavaScript异常处理语句

    程序运行过程中难免会出错,出错后的运行结果往往是不正确的,因此运行时出错的程序通常被强制中止.运行时的错误统称为异常,为了能在错误发生时得到一个处理的机会,JavaScript提供了异常处理语句.包含try-catch.try-catch-finally和throw. try-catch语句 try{ tryStatements } catch(exception){ catchStatements } 参数说明: tryStatements:必选项.可能发生错误的语句序列. exception

  • 关于jsp页面使用jstl的异常分析

    1.在jsp页面中使用如下代码加入jstl的支持 复制代码 代码如下: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 2.如果jsp页面报如下异常 org.apache.jasper.JasperException: java.lang.ClassNotFoundException: org.apache.jsp.Customer.addCustomerInfo_jsp

  • JSP学习之异常处理实例分析

    本文实例讲述了JSP异常处理的方法.分享给大家供大家参考.具体如下: 要对JSP程序可能产生的异常进行处理,可以从多个角度完成:可以针对特定的代码,可以针对特定的文件,也可以针对错误的类型. 如果针对特定的代码,可以使用标准标签库中的核心标签库中的<c:catch>标签. 如果针对特定的文件,可以使用JSP的page指令中的isErrorPage属性和errorPage属性完成. 如果针对特定类型的错误,可以使用web.xml配置文件. 1 使用<c:catch>进行异常处理 &l

  • Java异常处理实例分析

    本文实例讲述了Java异常处理的用法.分享给大家供大家参考.具体分析如下: Java的异常处理机制可以帮助我们避开或者处理程序可能发生的错误,从而使得程序在遇到一些可恢复的错误的时候不会意外终止,而是去处理这些错误,也使得我们在写程序的时候不必写大量的代码来检查错误情况,增强了代码的可读性和逻辑性.在Java中,异常代表一个错误的实体对象. 异常可分为两类:一类是严重错误,如硬件错误.内存不足等,它们对应着java.lang包下的Error类及其子类.通常这类错误程序自身是无法恢复的,需要中断程

  • JSP上传图片产生 java.io.IOException: Stream closed异常解决方法

    在做 jsp 上传图片时,把 java 代码直接改成 jsp,上传时产生 如下异常: 2012-12-31 8:59:21 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() for servlet jsp threw exception java.io.IOException: Stream closed ... 百思不得其解,翻出 jsp 转成 servlet 后的代码.如下(很很的醒目一下):

  • Java多线程之多线程异常捕捉

    一:为什么要单独讲多线程的异常捕捉呢? 先看个例子: public class ThreadException implements Runnable{ @Override public void run() { throw new RuntimeException(); } //现象:控制台打印出异常信息,并运行一段时间后才停止 public static void main(String[] args){ //就算把线程的执行语句放到try-catch块中也无济于事 try{ Executo

  • 浅谈JAVA 异常对于性能的影响

    在对客户做技术支持时,我们常常会看到很多客户根本没意识到的异常.在消除了这些异常之后,代码运行速度与以前相比大幅提升.这让我们产生一种猜测,就是在代码里面使用异常会带来显著的性能开销.因为异常是错误情况处理的重要组成部分,摒弃是不太可能的,所以我们需要衡量异常处理对于性能影响,我们可以通过一个实验看看异常处理的对于性能的影响. 实验 我的实验基于一段随机抛出异常的简单代码.从科学的角度,这并非完全准确的测量,同时我也并不了解HotSpot 编译器会对运行中的代码做何动作.但无论如何,这段代码应该

  • Java编程中10个最佳的异常处理技巧

    在实践中,异常处理不单单是知道语法这么简单.编写健壮的代码是更像是一门艺术,在本文中,将讨论Java异常处理最佳实践.这些Java最佳实践遵循标准的JDK库,和几个处理错误和异常的开源代码.这还是一个提供给java程序员编写健壮代码的便利手册.Java 编程中异常处理的最佳实践 这里是我收集的10个Java编程中进行异常处理的10最佳实践.在Java编程中对于检查异常有褒有贬,强制处理异常是一门语言的功能.在本文中,我们将尽量减少使用检查型异常,同时学会在Java编程中使用检查型VS非检查型异常

  • 深入剖析Java中的各种异常处理方式

    1. 调试追踪代码: 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

  • 深入剖析java中的集合框架

    解析:如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象,那么可以使用Java集合框架. 如果启用集合的删除方法,那么集合中所有元素的索引会自动维护. 集合完全弥补了数组的缺陷. 02.集合框架的内容 集合框架都包含三大块内容:对外的接口,接口的实现和对集合运算的算法 01.接口:表示集合的抽象数据类型 02.实现:集合框架中接口的具体实现 03.算法:在一个实现了某个集合框架的接口的对象身上完成某种有用的计算方法 java集合框架简图: 01.Collection接口存在储存一组

  • Java中多态性的实现方式

    什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法. 多态的作用:消除类型之间的耦合关系. 现实中,关于多态的例子不胜枚举.比方说按下

  • java中以DES的方式实现对称加密并提供密钥的实例

    java中以DES的方式实现对称加密并提供密钥的实例 加密原理 DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小.这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半.使用子密钥对其中一半应用循环功能,然后将输出与另一半进行"异或"运算:接着交换这两半,这一过程会继续下去,但最后一个循环不交换.DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算. 注释都在代码里了,干了: import jav

  • 深入剖析java中String、StringBuffer、StringBuilder的区别

    java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1. 可变与不可变 String类中使用字符数组保存字符串,如下就是,因为有"final"修饰符,所以可以知道string对象是不可变的. private final char value[]; StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在

  • Java中随机数的产生方式与原理详解

    Java中随机数的产生方式与原理 查阅随机数相关资料,特做整理 首先说一下java中产生随机数的几种方式 在j2se中我们可以使用Math.random()方法来产生一个随机数,这个产生的随机数是0-1之间的一个double,我们可以把他乘以100,他就是个100以内的随机数字,这个在j2me中没有. 在java.util这个包里面提供了一个Random的类,我们可以新建一个Random的对象来产生随机数,他可以生产随机整数.随机float.随机double.随机long,这个也是我们在j2me

  • Java中System.currentTimeMillis()计算方式与时间单位转换讲解

    一.时间的单位转换 1秒=1000毫秒(ms) 1毫秒=1/1,000秒(s) 1秒=1,000,000 微秒(μs) 1微秒=1/1,000,000秒(s) 1秒=1,000,000,000 纳秒(ns) 1纳秒=1/1,000,000,000秒(s) 1秒=1,000,000,000,000 皮秒(ps) 1皮秒=1/1,000,000,000,000秒(s) 1分钟=60秒 1小时=60分钟=3600秒 二.System.currentTimeMillis()计算方式 在开发过程中,通常很

  • Java 中EasyExcel的使用方式

    目录 背景 项目构建及依赖 创建实体类 生成Excel 解析Excel 其他相关特殊用法 自定义转换器 保留两位小数 排除指定Excel列 小结 背景 系统中经常要导出大量的数据,格式基本上都是Excel,然而每次导表都是对系统内存的一次挑战. 在Java领域,生成或解析Excel的框架比较有名的当属Apache的poi和jxl了.但使用它们,会面临着严重的内存损耗问题.如果系统的并发量还不行,一旦导出大量数据,便会出现JVM频繁full gc,甚至导致OOM. EasyExcel是阿里巴巴开源

  • 剖析Java中的事件处理与异常处理机制

    一.事件处理 其实,由事件处理这个名字自然就想到MFC中的消息响应机制,就我的体会,它们应该算是南桔北枳的情形吧,我怀疑Java中的事件处理这个"新瓶"应是装的MFC中的消息响应这个"旧酒".     所谓的"事件"即如键盘按键.鼠标点击等这类由动作或什么导致某个状态改变并需要对这个改变作相应响应的这类改变.我们可以将Java中的事件分为按钮.鼠标.键盘.窗口.其它事件这几大类.     事件处理模型  1.   基于继承的事件处理模型(JDK1

  • Java中map内部存储方式解析

    Map,即映射,也称为 键值对,有一个 Key, 一个 Value . 比如 Groovy 语言中,  def  map = ['name' : 'liudehua', 'age' : 50 ] ,则 map[ 'name' ]  的值是 'liudehua'. 那么 Map 内部存储是怎么实现的呢?   下面慢慢讲解. 一. 使用 拉链式存储 这个以 Java 中的 HashMap 为例进行讲解.   HashMap 的内部有个数组 Entry[]  table, 这个数组就是存放数据的. E

随机推荐