异常处理
异常是一些错误,但是并非所有的错误都是异常。异常能被程序本身进行处理。
掌握三种异常:
- 检查性异常-编译时不能忽略,不处理编译不能通过,(=非运行时异常)
- 运行时异常-编译时被忽略,不处理编译可以通过,如果有异常直接抛给控制台。
- 错误-错误不是异常,编译时检查不到。
java处理异常的机制:java代码在某处抛出异常,然后方法再进行捕捉。
Exception类的层次
所有异常类均为java.lang.Exception的子类。Exception类是Throwable类的子类(还有一个Error子类)。Java程序一般不捕获错误。错误一般发生在严重故障时,在java程序的处理范畴之外。
Exception子类:
- IOException
- RuntimeException
java.lang包是默认加载到所有的java程序的。大部分运行时异常类及其子类可以直接用。
异常方法
方法 | 描述 |
---|---|
String getMessage() | 返回关于发生的异常的详细信息 |
String toString | 使用getMessage()的返回结果返回类的串级名字 |
void printStackTrac() | 打印toString结果和栈层次到错误输出流(System.err) |
捕获异常
使用try…catch…模块。try/catch中的代码为保护代码。
import java.io.*;
public class ExcepTest{
public static void main(String args[]){
try{
int a[] = new int[2];
System.out.println("Access element three :" + a[3]);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("Exception thrown :" + e);
}
System.out.println("Out of the block");
}
}
结果:
Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3
Out of the block
多重捕获块
就是多加几个catch块。
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}
throws/throw
若一个方法没有捕获到一个检查性异常(在编译时无法忽略的异常),则该方法必须使用throws关键字声明。throws放在方法签名的尾部(可以抛出多个异常,用逗号隔开)。或者使用throw抛出一个异常。
区别:
- throws用在函数上,声明该函数的功能可能出现问题。出现问题便将异常抛出,将问题暴露出来,用于处理可以抛给虚拟机处理或者使用try/catch处理。虚拟机的处理方式:将异常打印出来,并将一场初的代码终止。
- throw用在代码块中,后面跟异常对象,用在方法中。
finally
finally关键字后面的代码块,无论是否发生异常,总是会被执行。因此可以放置清理类型等善后的工作。
注意:try、catch、finally要组合用的话,必须要连用,中间不能插入别的代码块。
finally永远都会在catch的return之前执行,若finally里有return,则catch的return不会被执行。
try{
//待捕获代码
}catch(Exception e){
System.out.println("catch is begin");//***
return 1 ;
}finally{
System.out.println("finally is begin");
return 2 ;
}
程序执行到***注释的一行时,先不向下执行return 1,而是执行finally模块,此时finally模块里有return 语句,因此在此执行return 2而不再执行catch里的return 1。
自定义异常
编写自定义的异常时注意:
- 所有的异常都必须是Throwable的子类
- 若自定义检查性异常类,继承Exception
- 若定义运行时异常类,继承RuntimeException
//自定义检查时异常类
class MyException extends Exception{
//其他
}