学习笔记-马士兵java-异常处理
1. 异常(Exception)的概念:
a. JAVA异常是JAVA提供的用于处理程序中错误的一种机制。
b. 所谓错误时指在程序运行的过程中发生的一些异常事件(如:除0溢出,数组小标越界,读取的文件不存在等)。
c. 设计良好的程序,应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果。
d. JAVA程序的执行过程中如出现异常事件,可以生成一个异常对象,该异常对象封装了异常事件的信息并被提交给JAVA运行时系统,这个过程称为抛出(throw)异常。
e. 当JAVA运行时系统接受到异常对象时,会寻找能处理这一异常的代码,并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。
补充说明:catch 不可以单独使用,必须和 try 联合使用。
补充说明:C 和 C++ 不检查数组下标是否越界。(IIS缓冲区溢出漏洞:即数组下标越界)
2. 使用 e.printStackTrace(); 打印堆栈信息:从错误源头到每个导致出现的错误都打印出来。
3. 异常的分类:
a. Throwable(可以被抛出的东西,所有异常类的根基类)
① Error(系统的内部错误,无法处理)
Ⅰ……
② Exception(可以处理的异常)
Ⅰ RuntimeException(运行时异常,经常出的错误,可以不catch)
① ……(常见异常,数组下标越界、空指针、除0等等)
Ⅱ……(除RuntimeException的其他Exception,必须 try...catch...)
4. 异常的分类:
a. Error:称为错误,由JAVA虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,程序对其不做处理。
b. Exception:所有异常类的父类,其子类对应了各种各样可能出现的异常事件,一般需要用户显示地声明或捕获。
c. Runtime Exception:一类特殊的异常,如被0除、数组下标越界等,其产生比较频繁,处理麻烦,如果显示的声明或捕获将会对程序可读性和运行效率影响很大。因此由系统自动检测并将它们交给缺省的异常处理程序(用户可不必对其处理)。
5. 异常的捕获和处理:
try {
//可能抛出异常的语句
} catch(someException1 e) {
//处理办法
} catch(someException2 e) {
//处理办法
} finally {
……
}
说明:
a. try 代码段包含可能产生例外(异常)的代码。
b. try 代码段后跟有一个或多个 catch 代码段。
c. 每个 catch 代码段声明其能处理的一种特定类型的异常并提供处理方法。
d. 当异常发生时,程序会终止当前的流程,根据获取异常的类型区执行相应的 catch 代码段。
e. finally 段的代码无论是否发生异常都会执行(用于关闭报错后为来的及关闭的文件等)。
6. 异常的捕获和处理:
a. try 语句:
① try{……} 语句制定了一段代码,该代码就是一次捕获并处理例外的范围。
② 在执行过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的 catch 语句要分别对这些异常做相应的处理。
③ 如果没有例外产生,所有的catch代码段都被略过不执行。
b. catch 语句:
① 在 catch 语句块中是对异常进行处理的代码,每个try语句块可以伴随一个或多个 catch 语句,用于处理可能产生的不同类型的异常对象。
② 在 catch 中声明的异常对象(catch(SomeException e))封装了异常事件发生的信息,在 catch 语句块中可以使用这个对象的一些方法获取这些信息。
③ 例如:
ⅠgetMessage() 方法:用来得到有关异常事件的信息。
ⅡprintStackTrace() 方法:用来跟踪异常事件发生时执行堆栈的内容(程序员常用)。
c. finally 语句:
① finally 语句为异常处理提供一个统一的出口,使得在控制流程转到程序的其他部分以前,能够对程序的状态作统一的管理。
② 无论 try 所指定的程序块中是否抛出例外,finally 所指定的代码都要被执行。
③ 通常在 finally 语句中可以进行资源的清理工作,如:
Ⅰ关闭打开的文件
Ⅱ删除临时文件
Ⅲ ……
d. throws 语句(此方法会抛出什么异常):
① 抛出异常(throws SomeException)
② 帮助文档(两种):
Ⅰ:直接在方法后面定义的。
Ⅱ:(方法说明中提示throws的)说明方法里会抛出某种异常。
e. throw 语句(在方法内如何实际抛出异常):
① 在方法中,throw new SomeException("异常说明"); //new一个构造方法(可查API文档)
7. 声明方法抛出的异常:
readFile() throws IOException{...} // 向下(上一级)抛出
method1() throws IOEception{ readFile() } // 向下(上一级)抛出
method2() throws IOException{ method1() } // 向下(上一级)抛出
public static main (String s) { //main方法也可以抛出异常,将异常交给运行时系统,打印堆栈信息。
try{ method2() } catch(IOException e) {...}
}
补充说明:JAVA的例外处理机制使得例外事件,沿着被调用的顺序往前需找,直到找到符合该例外种类的例外处理程序。
8. catch 的先后顺序:如果多个 catch 有父类与子类,则先catch子类,后catch父类,否则报错。
9. 使用自定义的异常一般步骤:
a. 通过继承 java.lang.Exception类 声明自己的异常类。
b. 在方法适当的位置生成自定义异常的实例,并用 throw 语句抛出。
c. 在方法的声明部分用 throws 语句声明该方法可能抛出的异常。
(不是最好的设计,更好的在以后项目中讲解):
class MyException extends Exception {
private int id;
public MyException(String message, int id) {
super(message);
this.id = id; //C语言遗留下的,不是很好的设计,以后项目讲解更好的设计
}
public int getId() {
retun id;
}
}
10. 异常和继承的关系: 重写方法需要抛出与原方法所抛出异常类型一致(子类与父类均不行,多了也不行)的异常或不抛出异常。
补充说明:虽然 main 方法也可抛出异常(给运行时系统),但实际项目不建议使用。
补充说明:建议 catch 更详细(有子类不用父类)的异常类,以区分不同异常的不同处理。
补充说明:捕获异常同时,及时处理(处理代码不能为空,不然此异常则石沉大海)。

浙公网安备 33010602011771号