Java的异常层次体系

Java的所有异常对象都派生自Throwable类,下层有两个分支:error和exception。

  • Error分支描述Java运行时系统内部错误或资源耗尽错误,遇到派生自Error的错误,程序除了通告给用户并尽量安全退出外也无能为力。
  • Exception分支才是程序员主要在意的异常,它又分为RuntimeException和IOException两个分支。
    1. RuntimeException通常是由于程序错误导致的。
    2. IOException通常程序本身没有问题,但由于像I/O错误等问题导致的。

Java规范将Error分支和RuntimeException分支的异常称为非受查异常,其他异常称为受查异常。

抛出异常

程序员在编写代码时若遇到无法处理的情况(受查异常),可以选择抛出异常,将问题交给程序的调用者解决。

在方法名后用throws语句声明异常告诉调用者代码会抛出什么异常,若需抛出多个异常时就必须列出所有的异常类用逗号隔开。一个方法必须声明所有肯抛出的受查异常。例如:

public void read()throws FileNotFoundException,EOFException

在方法中使用throw语句抛出异常,例如:

throw new IOException();

捕获异常

抛出异常是一种异常的解决方案,但不是最终方案。如果异常没有得到处理程序就会崩溃终止,因此需要捕获异常。Java提供了try/catch语句捕获异常。

如果try语句中发生了异常,则停止执行try块中的代码转而执行catch块中的代码,捕获读个异常时需为每个异常提供catch语句处理且catch语句自上到下要与异常继承链相同由子到父,还可以合并catch语句用‘|’合并捕获多个异常。

try {
  code
} catch (FileNotFoundException | UnknownHostException e) {
    exception handler
} catch (IOException e){
    exception handler
}

finally语句:若程序出现异常时,就会终止方法中剩余的代码并退出方法。如果方法获得了一些资源并且只有方法自己知道,就会产生资源回收问题。Java提出finally子句的解决方案,不管异常如何处理,finally子句一定会被执行。

处理异常时的几种代码执行顺序:

try{
    code1
    code that might throw exceptions
    code2
}catch(Exception e){
    code3
    code that might throw exceptions
    code4
}finally{
    code5
}
code6
  1. try块代码无异常,执行顺序为1,2,5,6
  2. try块代码中出现异常,catch语句中没有出现异常,执行顺序为1,3,4,5,6
  3. try块代码中出现异常,catch语句中也出现异常,执行顺序为1,3,5

带资源的try语句

对于实现了AutoCloseable或Closeable接口的资源,Java提供了带资源的try语句,当try块退出时,资源自动调用close()方法。

带资源的try语句(try-with-resources)的形式为:

try(Resource res = ...){
    // code work with res
}

AutoCloseable接口有一个close方法,它抛出一个Exception异常

void close() throws Exception;

Closeable接口继承自AutoCloseable接口 也有一个close方法,它抛出一个IOException异常

public void close() throws IOException;

断言

在检查受查异常时,通常会使用大量输出语句进行测试,这些语句在测试完毕后依然会留在程序中,如果程序中留有这些大量的检查语句会导致程序运行变慢。

在jdk1.4中引入了断言机制,它允许在开发和测试阶段在代码中插入一些检查语句检测异常。由于Java虚拟机默认断言是关闭的,因此在项目发布后不影响程序的运行。

断言的使用

  1. assert 条件;
  2. assert 条件:表达式;

当条件结果为false时,抛出AssertionError异常,在第二种形式中表达式会传入AssertionError类的构造器中形成一个消息字符串。

在测试中使用-enableassertions或-ea开启断言。

举个栗子:

Scanner in = new Scanner(System.in);
int x = in.nextInt();
assert x>0:x;
double y = Math.sqrt(x);


如果文章有错的地方欢迎指正,大家互相交流。感谢关注公众号JsjCoding

Java异常与处理机制的更多相关文章

  1. 全面理解Java异常的运行机制

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

  2. Java异常的处理机制(二)

    1.throw的作用 class Usre { private int age; public void setAge (int age) { if(age < 0) { RuntimeExce ...

  3. Java异常机制

    Java异常分类 异常表明程序运行发生了意外,导致正常流程发生错误,例如数学上的除0,打开一个文件但此文件实际不存在,用户输入非法的参数等.在C语言中我们处理这类事件一般是将其与代码正常的流程放在一起 ...

  4. 全面理解java异常机制

    在理想状态下,程序会按照我们预想的步骤一步一步的执行,但是即使你是大V,你也不可避免出错,所以java为我们提供了异常机制.本文将会从以下几个方面介绍java中的异常机制: 异常机制的层次结构 异常的 ...

  5. Java 异常机制

    Java 异常机制 什么是异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程 为什么要有异常 什么出错了 哪里出错了 ...

  6. Java异常机制简介

    什么是异常? 异常一般是指程序在编译期没有问题,但是在程序运行期出现的错误,一个程序会因为出现异常而终止运行,也就是我们常说的挂掉,在多线程下,异常只会影响所在的线程,对其他线程没有影响. Java异 ...

  7. 【55】java异常机制剖析

    一.为什么要使用异常 首先我们可以明确一点就是异常的处理机制可以确保我们程序的健壮性,提高系统可用率.虽然我们不是特别喜欢看到它,但是我们不能不承认它的地位,作用.有异常就说明程序存在问题,有助于我们 ...

  8. Java基础 -- 深入理解Java异常机制

    异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常. ...

  9. 【转】Java异常总结和Spring事务处理异常机制浅析

    异常的概念和Java异常体系结构 异常是程序运行过程中出现的错误.本文主要讲授的是Java语言的异常处理.Java语言的异常处理框架,是Java语言健壮性的一个重要体现. Thorwable类所有异常 ...

随机推荐

  1. SignalR--Web客户端

    原文:SignalR--Web客户端 这里说web客户端其实是JavaScript起的作用,也可以说是JavaScript客户端. 官方的标题的JavaScript客户端. 下面的翻译,同样的代码的形 ...

  2. Spring MVC的工作原理,我们来看看其源码实现

    前言 开心一刻 晚上陪老丈人吃饭,突然手机响了,我手贱按了免提……哥们:快出来喝酒!哥几个都在呢!我:今天不行,我现在陪老丈人吃饭呢.哥们:那你抓紧喝,我三杯白酒,把我岳父放倒了才出来的,你也快点.看 ...

  3. qt的demo中,经常可以看到emum

    最近开始看QT的文档,发现了很多好东西,至少对于我来说 收获很多~~~ 当然很多东西自己还不能理解的很透彻,也是和朋友讨论以后才渐渐清晰的,可能对于QT中一些经典的用意我还是存在会有些认识上的偏差,欢 ...

  4. Gps坐标有效性判定

    百科:纬度 是指某点与地球球心的连线和地球赤道面所成的线面角,其数值在0至90度之间.位于赤道以北的点的纬度叫北纬,记为N:位于赤道以南的点的纬度称南纬,记为S. var regex = new Re ...

  5. 原创powershell脚本:通过远程桌面3389黑名单,阻止黑客ip

    远程桌面 3389 ban ip 防火墙 rdp   通过远程桌面3389黑名单,阻止黑客ip.这是一个常见的需求.但我搜遍了谷歌也找不到成品脚本.想做搬运工却做不成,只能自己费尽写.下载备用吧,估计 ...

  6. hive表批处理

    对hive中的表进行批量处理,如下是一个简单的脚本 #给定一个hive数据库名,生成它的所有表的create SQL语句,并导出到文件 create_fun(){ hive -e } #显示一个表中所 ...

  7. chrome和safari字体粗细问题

    因为我用的是mac电脑,写项目所遇到的问题,这也是我上网和手动试了多次,觉得有效,分享给大家 -webkit-font-smoothing: subpixel-antialiased; -webkit ...

  8. aspose授权亲测可用配套代码

    支持excel,word,ppt,pdf using Aspose.Cells; using Aspose.Words.Saving; using ESBasic; using OMCS.Engine ...

  9. 《大型网站系统与Java中间件》读书笔记 (中)

    前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾上一篇: <大型网站系统与Java中间件& ...

  10. 【React】react学习笔记01-概念与基本使用

      俺为啥要学这玩意:   家里的杂事好不容易处理完了,开始正式静下心来学习~博主是做后端开发的,js基础不深,之前也是用React写过许多东西了,但是基本上都是用的CV大法,别人的组 件修修改改拿来 ...