其他JAVA学习的内容见:目录
异常概述
- 程序面对复杂度情况,例如:程序编写可能出错;用户的输入出错;程序所在的操作系统出错;网络不通等。
- 异常:运行期出现的错误
try{
//业务逻辑实现代码
...
}catch(Exception e){
处理错误
}
- Java异常:一种用于处理程序中错误的机制。
- 程序运行出现意外情况时,JVM生成一个Exception对象来通知程序。
- 错误:程序运行过程中发生的异常事件。
- 例如:除数为0,数组下标越界。
- 说明:设计良好的程序应在异常发生时提供处理错误的方法,程序不会因为错误发生而阻断或发生不可预见的错误。
- 流程:
Java异常分类
-
分类方法(1)
- Error:错误,由JVM生成并抛出,如虚拟机错误,程序不做处理(少见)。
- Exception:所有异常类的父类(可以处理的错误)。
- RuntimeException
- 例如:数组访问越界,访问空指针
- 经常出的错误,可catch可不catch。
- 编程导致的错误,程序员的错误。
- 非RuntimeException
- 试图读一个磁盘上不存在的文件:IOException
- RuntimeException
- 理解:
- 如果出现RuntimeException,就一定是程序员的问题
- RuntimeException名字易引起误会,实际上所有的异常都发生在运行时刻
-
分类方法(2)
- 未检查(unchecked)异常
- 包括:Error的子类异常 && RuntimeException的子类异常。
- 特点:不能由编译器检查;可以通过编程避免。
- 已检查(checked)异常:unchecked以外的异常
- 特点:编译时检查,提高了程序的安全性
- 未检查(unchecked)异常
声明抛出异常
- 方法:可以告诉编译器该方法有可能发生的错误。
public FileInputStream(String name) throws FileNotFoundException
- 方法何时用throws声明要抛出的异常?
- 调用了一个抛出已检查异常的方法,方法中没有处理异常。
- 程序运行时发现错误,利用
throw
抛出一个异常,方法中没有处理异常。
- 若一个方法抛出多个Checked异常,则在方法定义头部列出所有的异常,每个异常用“,”分开。
void method1() throws Exception1,Exception2,...
- 总结
- 程序不应该声明:
- Error继承来的异常
- 从RuntimeException继承来的异常(程序应该可以控制)。
- 若方法中没有对异常进行处理,则必须在方法头中用throws声明方法可能抛出的异常(已检查异常)。
- 一个方法抛出多个已检查异常,在
throws
后全部列出。 - 一个方法应该声明所有可能抛出的已检查异常,而未检查异常要么不可控制(Error),要么应该避免发生
- 程序不应该声明:
异常的捕获和处理
- 方法处理异常的原则
- 处理方法能够处理的异常
- 不能处理的异常:抛出
- 声明抛出已知的异常:如方法定义中抛出的异常
- 代码中手工抛出:throw new ***Exception()
自定义异常
- 自定义异常的方法
- 继承Exception或RuntimeException,形成异常类。
- 构造方法:
- 无形参的构造方法
- String形参的构造方法,String作为异常对象的描述信息
public class AuctionException extends Exception{
// 无参数的构造器
public AuctionException(){}
// 带一个字符串参数的构造器
public AuctionException(String msg){
super(msg);
}
}
方法重写中的异常处理
- 重写方法需要抛出与原方法所抛出异常类型一致(相同的类或子类)的异常或不抛出异常
class A {
public void method() throws IOException{...}
}
class B1 extends A{
public void method() throws FileNotFoundException{...}
}
class B2 extends A{
public void method() throws Exception{...}
}//错误的
class B3 extends A{
public void method(){...}
}