Java异常

    Java语言中,将程序执行中遇到的不正常的情况称为"异常"。

一、执行过程中发生的异常事件分为两类:

1、Error(错误):Java虚拟机无法解决的严重问题。
        比如:JVM系统内部错误、资源耗尽等严重情况。StackOverflowError[栈溢出]和OOM(out of memory)。
        Error是严重错误,程序会崩溃。
2、Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性代码进行处理。
        比如:空指针的访问,读取不存在的文件,网络连接中断等。
     Exception分为两大类:运行时异常和编译时异常(编译时异常就是由编译器检查出来的异常)。

二、⭐异常体系图:

Throwable类,所有错误或异常的超类,分为:
    Error和Expection
如图:
    

三、五大常见运行时异常

1、NullPointerException:空指针异常
    
    当应用程序试图在需要对象的地方使用 null 时,抛出该异常。这种情况包括:
        * 调用 null 对象的实例方法。
        * 访问或修改 null 对象的字段。
        * 将 null 作为一个数组,获得其长度。
        * 将 null 作为一个数组,访问或修改其时间片。
        * 将 null 作为 Throwable 值抛出。
    
2、ArithmeticExpection:数学运算异常
    
    当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。
3、ArrayIndexOutOfBoundsException:数组下标越界异常
        
    用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。
4、ClassCastExeception:类型转换异常
    
    当试图将对象强制转换为不是实例的子类时,抛出该异常。
    例如,以下代码将生成一个 ClassCastException:
         Object x = new Integer(0);
         System.out.println((String)x);
5、NumberFormatException:数字格式不正确异常
    
    当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。

四、异常处理的方式

1、try-catch-finally
    程序员在代码中捕获发生的异常,自行处理。
    ①在try中发生异常,将在异常的位置停止,异常后面的内容不再执行,直接跳入catch块。
    ②可以有多个catch语句,捕获不同的异常,要求父类在后,子类在前。
            因为如果发生异常,只会匹配一个catch。
    ③也可以只使用try-finally,没有catch,这样相当于没有捕获异常,程序会在执行完finally之后直接崩掉。
            应用:执行一段代码,无论是否发生异常,都需要执行的代码。
    ④如果有finnally,即使在catch中有return语句,不会立刻返回,会在底层将返回值保存在临时变量中。
        然后是先执行完finally中代码,
        若finally中没有return,则执行完后再从catch中返回,注意, 返回值为之前的临时变量保存值
        若finally中有return,则直接在finally中返回
    ⑤捕获到异常之后,执行完finally代码之后,会继续执行之后的代码
try{
    //可能发生异常的代码
}catch(Exception e){    //若没有发生异常,则catch块代码不执行
    //1.异常发生后,系统将异常封装成Exception对象后传递给
    // catch快中的e.
    //2.得到异常后程序员自己处理
}finally{
    //无论try中代码是否有异常都要执行此块中代码。
}
2、throws
    在方法声明中使用throws语句声明抛出异常的列表,可以是方法中产生的异常,也可以是它的父类。
    将发生的异常抛出,交给调用者(方法来处理),最顶级的处理者是JVM。
    调用者可以使用try-catch-finally解决也可以继续抛给调用者。
    JVM处理异常时,先输出异常信息,然后中断程序。
    ①对于编译异常,程序中必须处理,使用两种方式都可。
    ②对于运行时异常,若程序中没有主动处理,则默认使用throws处理。
    ③子类重写父类方法时,对异常有规定:
            子类重写的方法,所抛出的异常类型要么和父类异常一样,要么为父类异常的子类。
    ④抛出异常是编译异常,调用者必须处理;
        抛出异常为运行时异常,调用者可以不处理,因为运行异常有默认处理方式。
    
四、自定义异常
    当程序中出现某些错误,这些错误不在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该异常信息。
1、步骤:
①定义类:
    自定义异常类名 继承 Expection 和 RuntimeException。
②继承Expection,属于编译异常。
③继承RuntimeException,属于运行时异常。
代码中有一个throw,他与throws区别:
throw是语句抛出一个异常。
语法:
    throw (异常对象);throw e;
throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)
语法:
    [(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{......}
    public void doA(int a) throws Exception1,Exception3{......}
区别①:
    throws: 跟在方法声明后面,后面跟的是异常 类名
    throw: 用在方法体内,后面跟的是异常类 对象名
区别②:
    throws: 可以跟多个异常类名,用逗号隔开 
    throw: 只能抛出一个异常对象名
区别③:
    throws: 表示抛出异常,由该方法的调用者来处理 
    throw: 表示抛出异常,由该方法体内的语句来处理
区别④:
    throws: throws表示有出现异常的可能性,并不一定出现这些异常 
    throw: throw则是抛出了异常,执行throw一定出现了某种异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值