异常继承体系结构
- Throwable类是JAVA语言中所有错误或异常的超类
Error
代表JVM本身的错误或发生在JVM试图运行程序时,不希望被程序捕获,不能被代码处理,而且很少出现。不是我们关注的重点。
- JVMError
- StackOverFlowError
- 形成原因:死循环或无穷递归
- OutOfMemoryError 内存溢出
- 形成原因:加载数据量庞大等
Exception
异常层次结构的根类。异常处理的核心。
- RuntimeException(UnCheckedException)
- 运行时异常。对于这类异常,我们应修正代码,而不是通过异常处理器处理。
异常 | 描述 |
---|---|
ArithmeticException | 异常的运算条件。如:除零异常 |
ArrayIndexOutOfBoundsException | 非法索引访问数组异常。如:索引为负或大于等于数组大小 |
IllegalArgumentException | 向方法传递不合法或不正确的参数异常。 |
NullPointerException | 空指针异常。 |
NumberFormatException | 将字符串转换成不适当的类型的异常。 |
ArrayStoreException | 错误类型对象存储到一个对象数组异常。 |
IllegalStateException | 非法或不适当的时间调用方法时产生的异常。即JAVA环境或应用程序没有处于请求所要求的适当状态下。 |
IllegalThreadStateException | 线程没有处于请求所要求的适当状态时的异常。 |
IndexOutOfBoundsException | 某排序索引(数组、字符串或向量)超出范围异常 |
NegativeArraySizeException | 创建大小为负的数组的异常。 |
SecurityException | 安全管理器抛出的异常。 |
StringIndexOutOfBoundsException | 字符串索引为负或超出长度的异常。 |
- NonRuntimeException(CheckedException)
- 非运行时异常,JAVA强制要求为这样的异常做处理工作(try-catch-finally 或 throws),否则编译不会通过。这种异常一般由程序的运行环境导致,因为程序可能运行在未知环境下,应该为这样的异常时刻准备着。
异常 | 描述 |
---|---|
SQLException | 操作数据库异常 |
IOException | IO异常的根类 |
EOFException | 文件结束异常 |
FileNotFoundException | 找不到文件异常 |
InterruptedException | 线程中断异常。 |
ClassCastException | 类型转换异常 |
CloneNotSupportedException | 该对象类无法实现Cloneable接口的异常。 |
IllegalAcessException | 拒绝访问类的异常。 |
InstantiationException | 由于类对象是接口或抽象类无法实例化抛出的异常。 |
NoSuchFeildException | 请求变量不存在的异常。 |
NoSuchMethodException | 请求方法不存在异常。 |
自定义异常
- 所有异常都必须为Throwable的子类。
- 检查类异常则继承Exception类。
- 运行时异常则继承RuntimeException类。
例1:IOException源码
public class IOException extends Exception
{
static final long serialVersionUID=7818375828146090155L;
//无参构造
public IOException()
{
super();
}
//String为参数的构造
public IOException(String message)
{
super(message);
}
//String,Throwable为参数的构造
public IOException(String message,Throwable cause)
{
super(message,cause);
}
//Throwale为参数的构造
public IOException(Throwable cause)
{
super(cause);
}
}
例2:NullPointerException源码
package java.lang;
public class NullPointerException extends RuntimeException {
private static final long serialVersionUID = 5162710183389028792L;
public NullPointerException() {
super();
}
public NullPointerException(String s) {
super(s);
}
}
异常处理
- try…catch…finally语句块
try {
//可能发生异常的程序代码
//若无异常,则执行finally语句块
//若发生异常,则匹配catch语句块
} catch(Exception e1){
//每个catch块用于捕获并处理一个特定异常。
//定义异常类型和异常参数。按顺序匹配
//若try块中发生的异常在后续的catch中均未捕获,
//则先执行finally,然后到函数外部caller中匹配异常处理器。
//try块中若无异常,则所有的catch块将被忽略。
} catch(Exception e2){
} finally{
//可选
//**必定会执行**
//一个try块至少有一个catch块或finally块,
//但finally不是处理异常的,不会捕获异常。
//finally主要做一些清理工作,如流的关闭,数据库连接的关闭等。
}
notice:
- try,catch,finally中局部变量(包括异常变量)不可共享。
- 函数的某条语句发生异常时,这条语句后面的语句不会再执行,而是转去匹配的catch块执行,异常处理完成,执行流会接着处理了这个异常的catch块后执行。
例:
public static void main(String[] args){
int result = test();
System.out.println(result);
}
public static int test(){
int i = 1;
try{
i++;
System.out.println("try block, i="+i);
return i;
}catch(Exception e){
i++;
System.out.println("catch block, i="+i);
return i;
}finally{
i = 10;
System.out.println("finally block, i="+i);
return i;
}
}
输出结果为:
try block, i=2
finally block, i=10
10
- throws函数声明及throw异常抛出语句
- 抛出异常,而方法无法自己完全处理掉。仅仅向函数中可能出现的异常向调用者声明,自己不具体处理。
- 采取这种异常处理的原因是:方法本身不知如何处理这种异常,或者让调用者处理更好,调用者需为可能发生的异常负责。
public void function() throws ExceptionType1 e1, ExceptionType2 e2
{
//内部可抛出ExceptionType1,ExceptionType2类的异常
//或他们子类的异常对象
if(user == null){
throw new ExceptionType1("user is null");
}
}
常用的输出异常的函数:
- getMessage()方法,Exception类方法之一,返回异常原因
- printStackTrace()方法,Exception类方法之一,输出函数栈信息,即异常出现位置。