JAVA异常机制是Java提供的用于处理程序在运行期可能出现的异常事件(如数组下标越界、文件不存在等)的一种机制,使程序不会因为 异常的发生阻断或产生不可预见的结果 。而且还可以将逻辑代码错误处理代码分开,使程序员无需考虑较复杂的例外情况。

一、异常继承架构

JDK 中定义了很多异常类,这些类对应了各种各样可能出现的异常事件,所有异常对象都是派生于Throwable类的一个实例。如果内置的异常类不能够满足需要,还可以创建自己的异常类。Throwable类分为 Error错误 和 Exception异常。Error是由Java运行时系统内部错误和资源耗尽错误,这类错误是我们无法处理的。包括设备错误、动态链接失败、虚拟机错误等。

Exception是所有异常类的父类,其子类对应各种各样肯出现的异常事件,包括 RuntimeException异常 、 非RuntimeException异常 和 自定义异常,Exception异常一般需要程序员显示的声明或捕获。

1、运行时异常

RuntimeException是运行时异常,这类错误通常是由编程错误引起的,产生比较频繁,如果显式的声明或捕获将会对程序可读性和运行效率影响很大。因此由系统自动检测并将它们交给缺省的异常处理程序,此类异常可以不捕获。如:ArithmeticException、NUllPointException、ClassCastException、ArrayIndexOutOfBoundsException、NumberFormatException等。

  1 //当被除数为0时,引起ArithmeticException
2 int a = 1/0;
3
4 //访问null对象的成员变量或方法时,NullPointerException
5 Integer b = null;
6 b.toString();
7
8 //访问的元素下标超过数组长度,ArrayIndexOutOfBoundsException
9 int [] c = {1,2,3};
10 System.out.println(c[4]);
11
12 //数字格式异常,NumberFormatException
13 Integer d = new Integer("123e");
14
15 //类型转换错误,ClassCastException
16 //可以用instanceof 运算符判断对象是否是特定类的一个实例
17 Thread e = (Thread)new Object();

2、非运行时异常

非RuntimeException异常也是运行时异常,但必须捕获,否则会引起编译错误。如IOException、ClassNotFoundException、InterruptException等。

3、自定义异常

在程序中。可能会遇到标准异常类都没有充分的描述清楚的问题,这种情况下可以自定义异常类。定义的类应该包括两个构造器,一个是默认构造器,一个是带有详细信息的构造器。自定义异常的生成步骤如下:

继承 Exception类 、 RuntimeException类 其子类并定义相关的异常事件信息属性以及方法。

② 在方法适当的位置生成自定义异常的实例,并用throw语句抛出

③ 在方法的声明部分用throws语句声明该方法可能抛出的异常。

  1 //自定义非RuntimeException
2 class MyException extends Exception{
3 private int msg;//出错信息
4 private int num;//自定义编号
5
6 public MyException() {
7 super();
8 }
9 public MyException(String msg,int num) {
10 super(msg);
11 this.num = num;
12 }
13
14 public int getNum() {
15 return num;
16 }
17 }

二、异常的捕获与处理

Java采用面向对象的方式处理异常,处理有 捕获catch抛出throw 两种方式。程序在执行过程中若出现异常事件,将异常事件的信息封装成异常类对象,并抛出throw给java运行时系统。JRE会终止当前程序正常的执行流程,根据获取异常对象的类型(或父类异常类型)去执行处理这一异常的相应捕获catch代码段。

若没有找到,则JRE会沿着函数被调用的顺序往前抛出异常直至找到符合该异常类型的catch语句,给若都没有找到,JVM会默认打印出异常的堆栈信息。

1、try catch语句

(1)语法格式

try代码段可能产生一种或几种类型的异常对象,每一个try语句具有一个或多个catch语句,每一个catch语句提供一种异常类型的处理方法。当异常处理的代码执行完后,是不会回到try语句去执行尚未执行的代码。

  1 try {
2 //可能抛出异常(例外)的代码
3 }catch(SomeException e1){
4 //异常e1的处理方法
5 }catch(SomeException e1){
6 //异常e2的处理方法
7 }finally{
8 //关闭资源
9 }

(2)catch异常类型

如果异常类之间有继承关系, try语句块中,父类异常的捕获语句不可以写在子类异常捕获语句的前面,否则会引起编译错误。另外,建议为不同类型的异常都作出相应处理,而不是只声明大类异常。

  1 FileInputStream in = null;
2
3 try {
4 in = new FileInputStream("file.txt");
5 int b = in.read(); //可能发生FileNotFoundException
6 while (b != -1) {
7 System.out.print((char) b);
8 b = in.read();
9 }
10 } catch (FileNotFoundException e) { //子类异常
11 System.out.println(e.getMessage());
12
13 } catch (IOException e) { //父类异常
14 e.printStackTrace();
15 } finally { //关闭打开的资源
16 try {
17 if(in != null ) in.close(); //防止出现NullPointerException
18 } catch (IOException e) {
19 e.printStackTrace();
20 }
21 }

(3)异常事件信息

异常对象中封装了异常事件发生的信息,可以使用异常对象的构造器设定异常出错信息,并在catch语句中使用异常对象的方法获取这些信息,如:

  1 //这些方法均继承Throwable类
2 toString()方法:显示异常类名和产生异常的原因
3 getMessage()方法:只显示产生异常的原因,但不显示类名
4 printStackTrace()方法:用来跟踪异常事件发生时执行堆栈的内容

并提供捕获

2、throw与throws语句

(1)异常声明throws语句

若一个方法可能抛出多个非RuntimeException异常,不一定非要立即使用catch语句进行处理,对于目前无法处理的异常,还可以在方法的首部声明该方法可能抛出的所有的异常(声明其父类亦可),将异常交于调用它的方法处理,声明的异常之间使用逗号隔开。

  1 	public static void f()throws IOException,Exception{
2 int a = 2/0; //运行时异常,可以不throws声明
3 throw new IOException(); //非运行期异常,必须throws声明
4 }

(2)手动抛出异常throw语句

Java异常对象除了程序执行过程中出现异常时由系统自动生成抛出,也可以手动创建并throw抛出Exception异常,或 自定义异常。

  1 	public static void f(){
2 try {
3 throw new IOException("出现IO异常");
4 } catch (IOException e) {
5 // TODO Auto-generated catch block
6 e.printStackTrace();
7 }
8 }

在捕获一个异常前,必须有一段代码先生成异常对象并抛出,这个过程我们可以手动做,也可以由JRE来实现,但是他们调用的都是throw子句。

(3)方法重写中声明异常原则

重写方法需要抛出 与原方法异常类型一致  或  不抛出异常

3、使用异常机制的建议

①  只在异常的情况下使用异常机制,要避免使用异常机制代替错误处理、简单的测试程序等,这样会降低程序的清晰性,并且效率低下。

② 不要进行小粒度的异常处理,应该讲整块可能出现异常的语句都放在同一个try代码块中。

③ 异常往往在高层处理,不建议在底层处理异常

三、异常与资源处理

1、finally语句

finally语句为异常处理提供了统一的出口,无论try代码段是否有异常发生,finally代码段都会执行。finally语句可以在控制流程在转到程序其他部分之前,对程序的状态作统一的管理,如进行关闭打开的文件、删除临时文件、释放数据库连接等资源清除工作。

2、自动关闭资源

3、AutoCloseable接

Java笔记 - 异常机制的更多相关文章

  1. Java的异常机制

    Java的异常机制 (一)异常的概念 异常是指程序在编译或运行时出现的导致程序不能继续编译或运行的状况.. (二)Throwable类 Throwable类继承自Object类,是Java中所有错误或 ...

  2. 关于java中异常机制

    什么是异常:异常就是程序在运行时出现的不正常情况.对于严重的情况Java通过Error类进行描述,一般不用编写代码处理:对于不严重的情况Java通过Exception描述,一般编写针对性代码对其进行处 ...

  3. Java学习笔记--异常机制

    简介 在实际的程序运行过程中,用户并不一定完全按照程序员的所写的逻辑去执行程序,例如写的某个模块,要求输入数字,而用户却在键盘上输入字符串:要求打开某个文件,但是文件不存在或者格式不对:或者程序运行时 ...

  4. java笔记--反射机制之基础总结与详解

    一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...

  5. Java之异常机制(1) - 高效处理异常

    Java开发人员做出的有关架构的最重要的决定之一便是如何使用Java异常模型.Java异常处理成为社区中讨论最多的话题之一.一些人认为Java语 言中的已检查异常(Checked Exceptions ...

  6. Java笔记--反射机制

    1.Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法. 2.Java反射机制提供 ...

  7. java笔记--异常详解与处理

    一.异常概念 Throwable类是Java中所有错误或异常的超类. 1.只有当对象是此类(或其子类)的实例时,才能通过Java虚拟机或着Java throw语句抛出.     2.只有此类或其子类才 ...

  8. Java基础——异常机制

    [捕获异常] 硬件的错误.输入错误.物理限制等问题,都可能导致程序运行时的异常出现. 1.异常的分类层次 在java中,异常对象都是由Throwable类继承而来的,主要分为两大类: Error和Ex ...

  9. 异常小结:上一张图搞清楚Java的异常机制

    下面是Java异常类的组织结构,红色区域的异常类表示是程序需要显示捕捉或者抛出的. Throwable Throwable是Java异常的顶级类,所有的异常都继承于这个类. Error,Excepti ...

随机推荐

  1. 3.1_springboot2.x检索之elasticsearch安装&快速入门

    1.elasticsearch简介&安装 1.1.1.elasticsearch介绍 ​ 我们的应用经常需要添加检索功能,开源的 ElasticSearch 是目前全文搜索引擎的首选.他可以快 ...

  2. 2018ICPC焦作 D-Keiichi Tsuchiya the Drift King /// 几何

    题目大意: https://nanti.jisuanke.com/t/34142 有一个弯道抽象成圆的一部分 车子抽象成矩形 漂移过程中矩形上边会与圆的圆心在同一条直线上 以右上点贴着弯道边缘进行漂移 ...

  3. POJ1149_PIGS(网络流/EK)

    PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 15721   Accepted: 7021 Description ...

  4. MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合

    MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合 1.基本数据类型 我们常见有传递 int, string, bool, double, decimal 等类型. 需要注意的是前台传递的参 ...

  5. java获得磁盘、网络实时I/O速率

    最近项目中需要一个平台硬件资源的监控模块,当时采用了Sigar中api,但是做到针对磁盘和网络的实时I/O速率的时候发现Sigar并没有直接支持的接口.于是……它就诞生了.底层采用C++编写,通过ja ...

  6. js正则表达式常见面试题

    1 . 给一个连字符串例如:get-element-by-id转化成驼峰形式. var str = "get-element-by-id"; var reg = /-\w/g; / ...

  7. iOS开发系列-Shell脚本生成IPA

    概述 在公司开发到了测试阶段需要频繁打包交付给测试,看似简单的工作,重复的流程总是感觉不是那么好,我们可以借助苹果提供的编译指令编译项目. 自动化脚本编译打包IPA 常见的iOS项目就是基于xcode ...

  8. x25, PF_X25 - ITU-T X.25 / ISO-8208 协议接口。

    总览 #include <sys/socket.h> #include <linux/x25.h> x25_socket = socket(PF_X25, SOCK_SEQPA ...

  9. innodb 表

    1.innodb的存储引擎表类型 如果在创建表时没有显示的定义主键,则innodb存储引擎会按如下方式选择或创建主键 a.首先表中是否有非空的唯一约束(Unique not null)如果有,则该列即 ...

  10. AM8不能下任何载附件及所有聊天记录无法登记

    问题描述: 接收附件时,点击打开或者下载都不成功,但可以发送消息和附件.但在消息管理器中,也查询不到发送和接收的消息 原因分析:此问题是windows开机登录用户权限问题(若 登录的账号是 whx), ...