大话 Java 异常
异常
异常的概述
异常就是不正常的意思,Java 语言中主要是指程序在运行阶段产生的错误
Throwable(可抛出的,可扔出的)
java.lang.Throwable 类是 Java 程序所有错误或异常的超类
主要有两个字类
Error
Error 主要描述比较严重的错误
无法通过编程来解决的重大的错误
Exception
Exception 主要 m 描述比较轻量级的错误
可以通过编程来解决
Exception 类的主要分类
RuntimeException -> 运行时异常,也叫非检测性异常类
非检测性异常类就是指 b 编译阶段无法被编译器检测出来的异常
主要子类
ArithmeticException -> 算数异常类
ArrayIndexOutOfBoundsException(间接子类) -> 数组下标异常类
NullPointerException -> 空指针异常
ClassCastException -> 类型转换异常
NumberFormatException(间接子类)-> 数字格式异常
注意
当程序的执行过程中产生异常,若没有手动进行处理,则由 Java 虚拟机采用默认的方式进行处理,默认方式是打印异常名称、异常原因以及异常发生的位置并终止程序,后序代码无法被执行
IOException 和其他异常类 -> 其他异常类,也叫做非检测性异常
案例
TestRuntimeException.java
异常处理
运行时异常的处理方式
对于绝大数运行时异常来说,都可以通过条件判断避免异常的发生
异常的捕获
语法格式 try{可能产生异常对象的语句块}catch(异常类型 引用名){针对当前异常类型对象的处理语句块}.... (可以写多个 catch)finally{无论是否发生异常,都应该执行的语句块}
注意事项
当捕获的结构中有多个 catch 分支时,切记小范围的异常类型放在大范围的异常类型上面
懒人写法:catch(Exception e) {....}
执行流程
当没有产生异常的时候,程序的执行流程是:a b c f
当产生异常时,程序的执行流程是: a b e f
案例
TestExceptionCatch.java
异常的抛出
基本概念
某些特殊的场合中,当产生异常后却无法直接处理/不想处理时,此时就可以将异常转移给当前方法的调用者,这就叫异常的抛出
语法格式
返回值类型 方法名称(形参列表) throws 异常类型{....}
方法重写的原则
要求方法名相同、参数列表相同、返回值类型也相同,从 jdk1.5 开始允许返回子类类型
范围权限不能变小,可以相同或者变大
不能抛出更大的异常
注意
子类中重写以后的方法可以选择抛出与父类一样的异常、更小的异常、不抛出异常,但是不能抛出更大的异常、不同的异常
案例 A.java
自定义异常
自定义异常的由来
Java 官方库中虽然提供了大量的异常类,但不足以描述现实生活中所有的异常情况。当出现官方库中没有 m 描述的异常情况,这个时候就需要程序员自定义异常类加以描述,使得异常信息更加具备针对性和可读性
自定义异常的流程
自定义类继承自 Exception 类或者 Exception 类的子类
提供两个版本的构造方法,一个是无参构造方法,另一个是字符串做参数的构造方法
自定义异常 -- >案例 1
Person.java
自定义异常 -- > 案例 2
Student.java
此处有一点要注意,在案例一的 TestPerson 中,在 main 函数中,我们使用 try....catch 语句,异常由内部进行处理,会打印后面的语句而在案例二的 TestStudent 中,我们将异常直接交给 main 函数处理,也就是交给虚拟机处理,所以并不会执行后面的语句
异常对象的抛出
throw new 异常类型()
例如:
throw new Exception()
最后简单介绍一下 throws 和 throw 的区别
throws 和 throw 的区别
throws
用在方法声明后面,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throws 表示出现异常的一种可能性,并不一定会发生这些异常
throw
用在方法体内,跟的异常对象名
只能抛出一个异常对象名
表示抛出异常,由方法体内的语句实现
throw 则是抛出了异常,执行 throw 则一定抛出了某种异常
版权声明: 本文为 InfoQ 作者【若尘】的原创文章。
原文链接:【http://xie.infoq.cn/article/79c7a0590d2792deab88ff4e2】。文章转载请联系作者。
评论