本文的核心内容:Java中的异常体系,如何处理异常,自定义异常。
一:异常的分类
在面向对象的概念中,一个错误也是一个对象,犯了一个错误,也就是创建了一个错误对象。在 Java 中,有一个 java.lang.Throwable类,这个类是所有错误的父类。Throwable 类有两个子类:Error类和Exception类。
Throwable 类:所有错误的父类
|-- Error: 严重的底层错误,无法处理
|-- Exception : 异常,异常处理的主要对象
|-- RuntimeException 的子类:未检查异常,可以避免,可处理可不处理
|-- 非 RuntimeException 的子类: 已检查异常,无法避免,必须处理
二:常见的运行时异常
数组下标越界: java.lang. ArrayIndexOutOfBoundsException
类型转换异常: java.lang.ClassCastException
空指针异常: java.lang.NullPointerException
数据类型转换异常:java.lang.NumberFormatException
三:异常的产生和传递
异常的产生:
自动抛出异常 : 当程序在运行时遇到不符合规范的代码或结果时,会产生异常。
手动抛出异常 :语法 : throw new 异常类型 (“ 实际参数 ”);
产生异常 结果 :相当 于遇到 return 语句,导致程序因异常而终止。
异常的传递:
按照方法的调用链反向传递 ,如始终没有处理异常,最终会由 JVM进行默认异常处理(打印堆栈跟踪信息)。
四:异常的处理
try-catch 的语法结构如下:
try{
可能发生异常的代码;
}catch(捕获的异常类型 1 e){
异常处理 1…
}catch(捕获的异常类型 2 e){
异常处理 2…
} catch(捕获的异常类型 n e){
异常处理 n…
}
如果在 try 语句块中没有出现异常,那么任何一个 catch 语句块都不会得到执行。但一旦 try 块中出现了异常,程序的流程会马上跳出 try 块,根据异常类型的不同,进入某一个catch 语句块。随后,这个异常被宣告处理完毕,程序将继续向下正常运行。
finally
finally 语句是 try-catch 语句的一个补充。在 try-catch 语句块之后,可以加上一个 finally语句块,这个语句块中的代码,无论程序执行时是否发生异常,最终都会被执行。
正因为 finally 语句块中的代码一定会被执行,因此 finally 语句块中我们往往会放上一些释放资源的代码。例如,有下面一些步骤:
1. 申请数据库连接资源
2. 通过数据库的验证,得到数据库连接
3. 使用数据连接,完成数据库的操作
4. 释放数据库连接
在上面的四个步骤中,释放数据库连接就是一个非常典型的释放资源的过程。但是无论发生异常与否,数据库连接的释放都应该执行,因此这一步也就是所谓的一定要执行的一步。为了保证数据库连接的释放一定被执行,因此这一步应当放在 finally语句块中。
常用的结构:
try{ } catch{ }
try { } catch{ } catch{ }
try { } catch{ } finally{ }
try { } catch{ } catch{ } finally{ }
try { } finally{ }
注: 多重 catch , 遵循从子 ( 小 ) ) 到父 ( 大 ) ) 的顺序,父类异常在最后。
五:自定义异常
需继承自 Exception 或 Exception 的子类,常用 RuntimeException 。
一般,我们需要在自定义异常类中自定义构造函数:
class AgeMisMatch extends Exception{
public AgeMisMatch() {
super();
}
public AgeMisMatch(String message) {
super(message);
}
}
六:方法覆盖
带有异常声明的方法覆盖:
• 方法名、参数列表、返回值类型必须和父类相同。
• 子类的访问修饰符合父类相同或是比父类更宽。
• 子类中的方法,不能抛出比父类更宽的异常。
1377

被折叠的 条评论
为什么被折叠?



