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. 【Windows10 IoT开发系列】配置篇

    原文:[Windows10 IoT开发系列]配置篇 Windows10 For IoT是Windows 10家族的一个新星,其针对不同平台拥有不同的版本.而其最重要的一个版本是运行在Raspberry ...

  2. spring.net的简单使用(三)创建对象

    这篇主要说对象的创建方式. spring.net提供了三种创建对象的方式,分别是构造器创建,静态工厂创建,实例工厂创建. 多数的情况下,容器会根据对象定义中type属性值去直接调用相应类型的某个构造器 ...

  3. delphi控件安装(安装ODAC、TeeChart、TServerSocket、TWSocketServer、TComm)

    一.oracle插件安装delphi7如何安装oracle access控件 假设ODAC主目录在 D:\dzj\odac Delphi7主目录在 D:\Program Files\Borland\D ...

  4. Qt使用MinGW编译,如何忽略警告

    Qt编译时经常出现以下警告: warning: unused parameter 'arg1' [-Wunused-parameter] warning: unused variable 'i' [- ...

  5. How Qt Signals and Slots Work(感觉是通过Meta根据名字来调用)

    Qt is well known for its signals and slots mechanism. But how does it work? In this blog post, we wi ...

  6. oh my god,写20万数据到Excel只需9秒

    还是菜鸟时,在某个.Net项目中,用户需要从业务系统导出Report,而数据量通常都在上万条以上,最初采用的方式就是在服务器端用NPOI生成Excel,把Data一行一行一个Cell一个Cell地写到 ...

  7. 简单解说Linux命令输出与命令替换

    Linux命令能提高更方便的使用性能.下面就这就来讲术Linux命令.将一个程序或Linux命令的输出作为另一个程序或命令的输入,有两种方法,一种是通过一个临时文件将两个命令或程序结合在一起,例如上个 ...

  8. php 的mvc开发

    至于什么MVC结构,其实就是三个Model,Contraller,View单词的简称,,Model,主要任务就是把数据库或者其他文件系统的数据按 照我们需要的方式读取出来.View,主要负责页面的,把 ...

  9. dedecms自学

    [dedecms笔记] index.htm                        主页模板head.htm                         列表头部模板footer.htm   ...

  10. spring 5.x 系列第16篇 —— 整合dubbo (代码配置方式)

    文章目录 一. 项目结构说明 二.项目依赖 三.公共模块(dubbo-ano-common) 四. 服务提供者(dubbo-ano-provider) 4.1 提供方配置 4.2 使用注解@Servi ...