1 Java中的异常处理
一、异常类说明
java中的异常包含如下几类:
1) 检查类异常:这类异常是程序的用户错误或问题引起的,这些是开发人员是无法预见的。例如:打开一个不存在的文件。
2) 运行时异常:运行时异常,是可能被程序开发人员避免的异常。
3) 错误:错误不是异常,而是脱离程序开发人员控制的问题。例如:当栈溢出,一个错误就发生,错误在编译时是检查不到的。
java中异常类:
Java的异常类都在java.lang包中。java中所有的异常,都是从java.lang.Exception中继承的子类。类的继承关系如下:
Throwalbe继承出Exception和Error两个子类。Error类在Java程序中通常不捕获,因为Error一般发生在严重故障时,java程序本身处理不了。
Java内置了很多基础操作异常类:
1、Java内置的检查类异常:
1) ClassNotFoundException:应用程序加载类时,找不到类定义,抛出此异常。
2) CloneNotSupportedException:当调用对象的Clone方法克隆对象时,发现该对象无法实现Cloneable接口,抛出此异常。
3) lllegalAccessException:拒绝访问一个类时,抛出此异常
4) InstantiationException:当试图使用类中的newInstance方法创建类的一个实例,而该类是一个接口、或一个抽象类无法实例化时,抛出此异常。
5) InterruptedException:一个线程被另一个线程中断,抛出此异常
6) NoSuchFieldException:请求的变量不存在,抛出此异常
7) NoSuchMethodException:请求的方法不存在时,抛出此异常
2、Java内置的非检查类异常(运行时异常):
1) ArithmeticException:当出现异常的运算条件时,抛出此异常。如除0
2) ArrayIndexOutofBoundsException:当采用非法索引访问数据组时,抛出此异常。
3) ArrayStoreException:试图将一个错误类型的对象存储入数组时,抛出此异常。
4) ClassCastException:试图将对象转换为不是实例的子类时,抛出此异常
5) lllegalArgumentException:向方法传递不合适、或不正确的参数时,抛出此异常
6) lllegalMonitorStateException:一个线程试图等待一个对象的监视器、或试图通知其他正在等待此对象的监视器,但是此线程本身没有指定监视器。
7) lllegalThreadStateException:线程没有处于求情操作所需要的状态时,抛出此异常。
8) IndexOutofBoundsEception:排序索引(数字、字符串、向量等的排序)超出范围时,抛出此异常
9) NegativeArraySizeException:程序试图创建大小为负的数组时,抛出此异常
10) NullPointerException:试图访问的对象为Null时,抛出此异常
11) NumberFormatException:试图把字符串转换为数字类型,但该字符不能转换时,抛出此异常。
12) SecurityException:由安全管理器抛出的异常,标识安全侵犯
13) StringIndexOutofBoundsException:指示的字符串索引为负数、或超出字符串大小时,抛出此异常。
14) UnsupportedOperationException:当不支持的请求操作时,抛出此异常。
异常类的方法,如下为Throwable类的方法:
1) public String getMessage() 返回关于异常的详细信息
2) public Throwable getCause() 返回代表异常的原因
3) public String toString() 使用getMessage的结果返回类的字符串级名字
4) public void printStackTrace() 打印toString的结果和栈层次的System.err
5) public StackTraceElement[] getStackTrace() 返回一个包含堆栈层次的数组
6) public Throwable fillnStackTrace() 用当前的调用栈层次填充Throwable 对象栈层次
二、如何使用异常类
1、java中捕获异常的语法:
try {
}
catch(异常类名字) {
}
catch(异常类名字) {
}
finally {
}
1) try块内的代码称之为保护代码,保护代码异常时,可抛出异常。可能是系统内置的异常、或用户自定义的异常。
2) catch块捕获异常。一个try可以有多个catch。异常会逐个和catch中的异常名字对比,找到匹配的,执行catch后的代码块。
3) finally用于指定不论是否发生异常,都会被执行的代码块。一般用于清理类等收尾善后工作。
4) 一个try语句不能既无catch、也无finally。finally可有可无,非强制性。
2、java中抛出一个异常的语法
抛出异常的关键字:throws throw
以函数自定义抛出一个RemoteException异常为例:
public class ClassName {
……
public void funcTest(Integer i) throws RemoteException {
.....
if(.....) {
throw new RemoteException();
}
}
}
一个方法可以抛出多个异常,中间用逗号隔开:
public void funcTest(Integer i) throws RemoteException, InsufficientFundsException
异常本质上,也是一个类。也需要定义,抛出时也需要new创建。
三、自定义异常类
1、定义异常类:
public class AException extends Exception
{
private double amount;
publice void AException(doubule amount) {
//也需要定义异常类的构造方法,new抛出异常时会调用
this.amount = amount;
}
public double getAmount() { //定义异常类的其他方法
return this.amount;
}
}
2、使用自定义异常:
函数执行时,抛出异常
public class MyClasss {
double a;
double b;
......
public void afunc() throws AException {
......
if(a < b) {
throw new AException(b-a); //创建异常,抛出
}
......
}
}
3、捕获自定义异常
public class BankDemo { //主类定义
.....
public static void main(String[] args) { //main函数
.....
.....
try{
MyClasss c = new MyClasss();
c.aFunc(); //含抛出自定义异常的编码块
}
catch(AExcption) { //捕获自定义异常
System.out.println("get AException")
}
}
}