Chapter6 异常处理
6.1 异常概述与异常体系结构
1. 异常类型:
- Error:Java虚拟机无法解决的严重问题, 一般不编写针对性代码处理
- 栈溢出 StackOverflowError
- 堆溢出 OOM
- Exception:其它因编程错误或偶然的外在因素导致的一般性问题, 可以使
用针对性的代码进行处理- 空指针访问
- 试图读取不存在的文件
- 网络连接中断
- 数组角标越界
2. 异常体系结构
分类:
- 编译时异常
- 运行时异常
3. 常见异常:
java.lang.Throwable
* |-----java.lang.Error:一般不编写针对性的代码进行处理。
* |-----java.lang.Exception:可以进行异常的处理
* |------编译时异常(checked)
* |-----IOException
* |-----FileNotFoundException
* |-----ClassNotFoundException
* |------运行时异常(unchecked,RuntimeException)
* |-----NullPointerException
* |-----ArrayIndexOutOfBoundsException
* |-----ClassCastException
* |-----NumberFormatException
* |-----InputMismatchException
* |-----ArithmeticException
6.2 异常处理机制
1. try-catch-finally
代码格式:
try{
//可能有问题的代码
}
catch(错误类型 变量1){
// System.out.println(变量1.getMessage())
}
catch(错误类型 变量2){
// 变量2.printStackTrace();
}
finally{
// 一定会执行的代码
}
- 用于处理编译时异常
finally
部分是可选的catch
中的错误类型存在子父类关系时,子类在上- 常用异常处理方式:
getMessage()
、printStackTrace()
try
结构内定义的变量作用域仅在try
结构内
2. throws
代码格式:
throws ErrorType1, ErrorType2,···
示例:
public class ExceptionTest {
public static void main(String[] args){
try{
method();
}catch(IOException e){
e.printStackTrace();
}
}
public static void method() throws FileNotFoundException,IOException{
// 方法体
// ******
}
}
- 写在方法声明处(大括号前),方法执行出现异常,则在异常处生成异常对象,满足throws后类型时则抛出
- 只是向上层抛出,并未真正处理异常,通常配合
try-catch-finally
使用
3. 重写方法与异常抛出
- 子类重写方法,抛出的异常不大于父类异常
- 父类中方法未使用
throws
则子类也不能使用,此时只能使用try-catch-finally
6.3 手动抛出异常
- 格式:
throw new 异常类型();
- 抛出的异常必须是Throwable或其子类的实例
6.4 自定义异常类型
- 继承于现有异常结构,
RuntimeException
、Exception
- 提供全局常量:
seriaVersionUID
- 代码示例:
class MyException extends Exception { static final long serialVersionUID = 13465653435L; private int idnumber; public MyException(String message, int id) { super(message); this.idnumber = id; } public int getId() { return idnumber; } }
注意例题EcmDef