异常机制
Java异常类产生的原因
由开发者通过if-else来解决异常问题 • 代码臃肿:业务代码和异常处理代码放一起 • 程序员要花很大精力"堵漏洞“ • 程序员很难堵住所有“漏洞”,对程序员本身要求比较高 Java提供异常处理机制。 它将异常处理代码和和业务代码分离,使程序更优雅,更好的容错性,高键壮性 过程: |
异常引入
异常( Exception 也称例外)就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序 • 所需文件找不到 • 网络连接不通或中断 • 算术运算错 (被零除) • 数组下标越界 • 装载一个不存在的类或者对null对象操作 • 类型转换异常 • …… 当Java程序出现以上的异常时,就会在所处的方法中产生一个异常对象。这个异常对象包括异常的类型,异常出现时程序的运行状态以及对该异常的详细描述 Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws |
异常处理
try-catch • 情况1:try块中代码没有出现异常 • 不执行catch块代码,执行catch块后边的代码 • 情况2:try块中代码出现异常,catch中异常类型匹配(相同或者父类) • 执行catch块代码,执行catch块后边的代码 • 情况3:try块中代码出现异常, catch中异常类型不匹配 • 不执行catch块代码,不执行catch块后边的代码,程序会中断运行 • 注意 • 出现异常后,Java会生成相应的异常对象,Java系统,寻找匹配的catch块,找到后将异常对象付给catch块异常参数 • 出现异常后,try块中尚未执行的语句不会执行 • 出现异常后并处理后,catch块后面的语句还会执行
try-catch-finally 在try-catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行 • 无异常 try-finally • 有异常 try-catch-finally 通常在finally中关闭程序块已打开的资源,比如:文件流、释放数据库连接等 • finally块中语句不执行的唯一情况 • 异常处理代码中执行System.exit(1)退出Java虚拟机 • Finally块的具体执行过程 • 执行try或catch中代码 • 遇到return/throw,先执行finally中语句块 • 执行return/throw 多重catch • 一段代码可能会引发多种类型的异常 • 当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个与异常类型匹配的catch语句 • 执行其中一条 catch 语句后,其后 catch 语句将被忽略 • 在安排catch语句的顺序时,首先应该捕获最特殊的异常, 然后再逐渐一般化,即先子类后父类 |
异常类型
方法名 | 说明 |
Exception | 异常层次结构的根类 |
ArithmeticException | 算术错误情型,如零除 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 尝试访问空对象成员 |
ClassNotFoundException | 不能加载所需要的类 |
InputMismatchException | 欲得到数据类型与实际输入类型不匹配 |
IllegalArgumentException | 方法接受到非法参数 |
ClassCastException | 对象强制类型转换出错误 |
NumberFormatException | 数字格式转换异常,比如把‘ab’转换数字 |
异常分类