1.异常处理类结构图:
2.派生于Error类或者RuntimeException类的所有异常类称为未检查异常(unchecked Exception)
所有其他的异常称为已检查的异常(CheckedException),即在编译时被强制检查的异常。
3.常见的几个异常:
①ArrayStoreException 将错误类型的对象存到对象数组时抛出
②ArithmeticException 异常运算条件时抛出(如除数为0)
③ArrayIndexOutOfBoundException 数组访问越界下标时抛出
④FileNotFoundException 打开文件失败时抛出
⑤IOException 读取和写入操作出错时抛出
4.throw和throws的区别:
throws是用来声明一个方法可能抛出的所有信息,throw是指在方法内部抛出一个具体的异常信息。throws在方法声明处使用,throw在方法内使用。
5.我们可以创建自己的异常类,只需要定义一个类继承于Exception,通常应该包含两个构造器,一个是默认的,一个可以传入字符串作为描述信息,要调用超类的构造器。
6.方法抛出的异常在两种情况下会丢失:
①finally中如果有抛出异常,而try中的异常没写catch,则try中的异常会被finally中的异常覆盖。
②如果finally中有return,而try中的异常没写catch,会把try中的异常丢失掉。
class OneException extends Exception{
public String toString(){
return "this is oneException!";
}
}
class TwoException extends Exception{
public String toString(){
return "this is TwoException!";
}
}
public class ExceptionClass {
public void method1 ()throws OneException{
throw new OneException();
}
public void method2 ()throws TwoException{
throw new TwoException();
}
public static void main(String[] args) {
try{
ExceptionClass ex=new ExceptionClass();
try {
ex.method1();
}
finally{
ex.method2();
}
}catch(Exception e){
e.printStackTrace();
}
try{
throw new OneException();
}
finally{
return;
}
}
}
运行结果:
7.在覆盖方法的时候,只能抛出在基类方法的异常说明里列出的那些异常,或者那些异常的子类,或者不抛出异常。在继承和覆盖的过程中,某个特定方法的异常说明的接口不是变大了而是变小了。
8.子类异常必须在基类异常前面捕获,否则会被基类异常覆盖。捕获一个基类异常,实际上会捕获所有从基类异常派生的子类异常。
9.checkException可以被包装进RuntimeException,这样即使是抛出checkException的方法也可以不必捕获异常。需要查找被包装的异常是具体什么异常的时候,用e.getCause()可以重新获得该异常。
package tes;
import java.io.FileNotFoundException;
import java.io.IOException;
public class SurroundException {
public static void main(String[] args) {
ExceptionClass ec=new ExceptionClass();
for(int i=0;i<3;i++){
try{
ec.choseException(i);
}catch(RuntimeException e){
try{
throw e.getCause();//获得该异常后再获取异常中包装的异常
}
catch(FileNotFoundException ex){
System.out.println("捕获到的异常里面包装的是FileNotFoundException!");
}
catch(IOException ex){
System.out.println("捕获到的异常里面包装的是IOException!");
}catch(Throwable ex){
System.out.println("捕获到的异常里面包装的是"+ex.getMessage());
}
}
}
}
}
class ExceptionClass{
public void choseException(int i){
try{
switch(i){
case 0:throw new IOException("this is 0 exception");
case 1:throw new FileNotFoundException("this is 1 exception");
case 2:throw new RuntimeException("RuntimeException");
default:return;
}
}
catch(Exception e){
throw new RuntimeException(e);//把checkException包装成RuntimeException
}
}
}
运行结果: