异常处理

结构体系

Throwable 所有异常的父类,几乎所有的异常都定义在这个父类中,子孙类基本没有特有方法
Error 错误:不能通过程序的方式解决,如内存溢出等严重错误
Exception 编译异常,必须得处理,否则编译报错
Runtimeexception 运行时异常,编译异常的子类,不强制处理,在运行时候可能报错

异常默认处理方式

1、在某个方法中,出现了和生活情况不同的数据时,没有必要继续往下执行,所以将这种情况封装成一个对象(异常对象)
2、将这个异常对象(通过throw)抛出给调用者,一层一层向上抛出,一直到主方法中
3、主方法也没有办法处理,抛出给jvm虚拟机
4、Jvm虚拟机,就将异常对象中的所有信息,使用标准错误流进行打印(在eclipse显示红色),将jvm结束掉

关键字

throw

主动抛出异常,在程序无法执行时,抛出异常,以便调用者进行下一步处理

throws

放在方法末尾,声明异常,作用是表示此方法不处理该异常,所声明的异常由调用者处理,如果一直抛到主方法都没有处理方法,就由jvm打印出异常信息

finally

无论怎样都会执行,就算try语句中要执行return语句也会先执行finally

public class FinallyTest03 {
public static void main(String[] args){
        int i = m1();
        System.out.println(i); 
    }
    public static int m1(){
        int i = 10;
        try{
            return i;
         //这里没有catch,所以不用在后面写return了
        }finally{
            i++;
            System.out.println("finally中的i=" + i); 
        }
    }
}

输出结果:.程序在执行到return i时,会先将i赋给一个临时变量,return的是这个临时变量:int temp = i;return temp;,然后再执行finally中的语句,打印出了11,之后再执行main方法中的语句,打印出10。

catch

可以捕捉多个异常,但是catch里面必须从小类型异常到大类型异常进行捕捉,先捕捉子后捕捉父,最多执行一个catch语句块里面的内容。
jdk7新特性,可以将多个捕捉的异常放到一个catch里面catch (FileNotFoundException | ArithmeticException e)

定义这么多异常子类,却又都没有特有方法的原因

1.需要使用不同的异常名称,描述不同的异常情况,方便写程序的时候能很快找到错误原因
2.如果有了不同的异常类型,可以在catch块中,根据不同异常类型,做不同的处理

原文地址:https://www.cnblogs.com/zhz-8919/p/10780013.html