异常
本章目标
-
了解异常的分类
-
了解异常捕获的分类
-
重点掌握异常处理和声明的规则
-
掌握如何编写自定义异常
什么是异常
异常就是在计算机程序运行的过程中,出现的各种各样错误
Java 异常类
异常类是 Java 中专门用来描述不同的异常情况的一些类,所有异常类组成了 Java 的异常类庞大的继承树体系
Exception 类
运行时异常类(RuntimeException)
-
Nullpointer Exception:空指针异常
-
ClassCastException:类型强制转换异
-
IllegalArgumentException:传递非法参数异
-
IndexOutOfBoundsException:下标越界异常
-
NumberFormatException:数字格式异常
-
ArrayIndexOutOfBoundsException: 数组越界异常
-
ArrayStoreException: 数组类型不一致异常
-
ArithmeticException: 算术异常(除 0 异常)
-
BufferOverflowException: 缓冲区溢出异常
非运行时异常类(CheckedException)
-
ClassNotFoundException:找不到指定 class 异常
-
IOException:IO 操作异常
-
FileNotFoundException:文件不存在异常
-
SQLException:SQL 语句异常
-
InterruptedException: 中断异常
异常处理机制
异常处理机制是 Java 语言中的一种机制,是 Java 语法的一个特色功能,通过恰当的使用该机制,可以使得 Java 语言编写的程序更加稳定
抛出异常(Throw Exception)
Java 程序在执行过程中如果出现异常,会自动实例化相应的异常类对象,该异常对象将被自动提交给 JVM,这一过程称为抛出异常
Java 可以使用 throw 和 throws 两种方式抛出异常
throw 用于在代码中抛出异常
语法格式
throw new 异常类型;
举例
void method ( String str ) { if ( str == null ) { throw new NullPointerException(); } }
throws 用于在方法中抛出异常
语法格式
方法名() throws 异常类型 { //方法体 }
举例
void method ( String str ) throws NullPointerException { … }
捕获异常(Catch Exception)
当 JVM 接收到抛出的异常对象时,会寻找能处理这一异常的代码,并把当前异常对象交给其处理,这一过程称为捕获异常(如果 JVM 找不到可以捕获异常的代码,则 Java 程序将异常退出)
语法格式
try { //代码段(可能发现异常的代码) } catch (异常类型1 exception) { //对异常进行处理的代码段 } catch (异常类型2 exception2) { //对异常进行处理的代码段 } catch (异常类型3 exception3) { //对异常进行处理的代码段 } catch (异常类型n exceptionN) { //对异常进行处理的代码段 } finall { //无论是否有异常,始终会被执行的代码 }
异常处理控制流程
-
当有异常发生时,代码控制流程转到执行 catch 中的异常处理代码,执行完毕后继续执行 catch 后的代码
-
当没有异常发生时,不会执行 catch 中的异常处理代码
-
一段代码可能会引发多种类型的异常,当引发异常时,会按顺序来查看每个 catch 的异常类型,并只执行第一个与异常类型匹配的 catch 中的异常处理代码,其他的 catch 中的异常处理代码将不会执行
-
在排列 catch 的顺序时,首先应该将捕获子类异常类型放在前面,然后是捕获父类异常类型
异常传播
当某个方法抛出异常时,如果当前方法没有捕获异常,异常就会被抛到上层调用方法,直到遇到某个 try ... catch 被捕获为止
printStackTrace( ) 方法:可以打印出方法的调用栈,对于调试错误非常有用(每层方法调用均给出了源代码的行号,可直接定位产生异常的代码位置)
自定义异常
自定义异常类推荐继承 RuntimeException 异常类
举例
public class MyException extends RuntimeException { public MyException() { super(); } public MyException(String msg) { super(msg); } public MyException(String msg, Throwable cause) { super(msg,cause); } }
自定义异常的使用
void method ( String str ) { //代码中抛出自定义异常类 throw new MyException(); } void method ( String str ) throws MyException {//方法中抛出自定义异常类 … }
异常处理机制的特点
-
通过异常传播可以将异常对象传递到合适的位置再处理,使得 Java 语言的异常处理更加灵活
-
可以在源代码级别将正常执行的逻辑代码和异常处理的代码相分离,更加便于代码阅读和维护
-
过度使用异常处理将降低程序的执行效率,增加语法的复杂度
练习题
class TestDemo { public static void main(String[] args) { System.out.println(test()); } public static int test() { int a = 2; try { System.out.println("try代码块return前"); return a; } finally { a = 3;// 修改a变量的值 System.out.println("finally 代码块"); } } }
结果
try代码块return前
finally 代码块
2