Java复习笔记 异常

 

目录

一、异常概述

二、异常体系图

三、异常处理机制 

方式一、try - catch - finally

方式二、throws

四、自定义异常

五、throw 和 throws 的区别?

一、异常概述

程序在运行过程中,发生的网络中断、磁盘空间不足、加载的类不存在等等,都是程序的不正常行为,java对这种不正常行为称作‘异常’。

执行程序过程中发生的异常事件可以分为两大类:Error 和 Exception

Error类称为错误类,通常都是java运行时产生的系统内部错误或者资源耗尽的错误,这种错误是非常严重的,靠修改程序是改变不了的。会自动退出JVM虚拟机。

Exception类也称为异常类,对于这种错误程序本身是可以处理的。Exception有一个特殊的子类RunimeException该类称为运行时异常,除了这个类和其子类之外,其他的类都是编译时异常。

编译时异常:编译器在对java文件进行编译时,会进行检查。如果有编译时异常,你就必须预处理。没有预处理,编译器就不同意,你就运行不了程序。

运行时异常:编译器检查不出来,一般指编程时的逻辑错误。对于这种错误你可以处理,也可以不处理。

说明:语法错误不是异常。没有任何关系

二、异常体系图

 代码举例

     运行时异常举例
     //空指针异常
     String name = null;
     System.out.println(name.length());
    
     //类型转换异常
     String name = "小牛马";
     //将String 转成 int
     int num = Integer.parseInt(name);//抛出NumberFormatException
     System.out.println(num);//1234
        
     //角标越界异常
     int[] arr = {1,2,4};
        for (int i = 0; i <= arr.length; i++) {
            System.out.println(arr[i]);
        }

    
     编译时异常举例
     //文件不能找到异常 Unhandled exception: java.io.FileNotFoundException
     FileInputStream inputstream = new FileInputStream(new File("src\\x.txt");

三、异常处理机制 

方式一、try - catch - finally

try里面放入可能会发生异常的代码语句,如果有运行时有异常发生,就会把异常信息传给catch,异常代码后面还未执行的代码就不会执行,catch里面放入对异常处理的代码语句。如果没有异常发生就执行完try代码块中的代码语句,最后在执行finally里面的语句。通常finally里面放的是要关闭的系统资源。

 * try{
 *         //可能出现异常的代码
 * 
 * }catch(异常类型1 变量名1){
 *         //处理异常的方式1
 * }catch(异常类型2 变量名2){
 *         //处理异常的方式2
 * }catch(异常类型3 变量名3){
 *         //处理异常的方式3
 * }
 * ....
 * finally{
 *         //一定会执行的代码
 * }
 * 
 * 说明:
 * 1. finally是可选的。
 * 2. 使用try将可能出现异常代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象
 *    的类型,去catch中进行匹配
 * 3. 一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常的处理。一旦处理完成,就跳出当前的
 *    try-catch结构(在没有写finally的情况)。继续执行其后的代码
 * 4. catch中的异常类型如果没有子父类关系,则谁声明在上,谁声明在下无所谓。
 *    catch中的异常类型如果满足子父类关系,则要求子类一定声明在父类的上面。否则,报错
 * 5. 常用的异常对象处理的方式: ① String  getMessage()    ② printStackTrace()
 * 6. 在try结构中声明的变量,再出了try结构以后,就不能再被调用
 * 7. try-catch-finally结构可以嵌套
 * 
 * 体会1:使用try-catch-finally处理编译时异常,是得程序在编译时就不再报错,但是运行时仍可能报错。
 *     相当于我们使用try-catch-finally将一个编译时可能出现的异常,延迟到运行时出现。
 *     
 * 体会2:开发中,由于运行时异常比较常见,所以我们通常就不针对运行时异常编写try-catch-finally了。
 *      针对于编译时异常,我们说一定要考虑异常的处理。

方式二、throws

 throws就是捕获异常向上抛出,谁调用了该方法,就抛给谁。最终的处理者是JVM虚拟机。

throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类
throws 关键字后也可以是 异常列表, 即可以抛出多个异常
子类重写父类的方法时,对抛出异常的规定:子类重写的方法,
所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出的异常类型的子类型

运行异常默认抛 编译异常必须二选一处理

运行时异常有默认处理机制,不需要强转要求显示处理,但是编译异常需要显示处理,否则编译这一关就过不了

 

 

四、自定义异常

直接继承Exception的话,就是编译时异常。在运行期间需要对异常进行显式处理

继承RuntimeException或者其子类,就是运行时异常,不需要显式处理、

1、一般地,用户自定义异常类都是RuntimeException的子类。

2、自定义异常类通常需要编写几个重载的构造器。

3、自定义异常需要提供serialVersionUID

4、自定义的异常通过throw抛出。

自定义异常最重要的是异常类的名字,当异常出现时,可以根据 名字判断异常类型

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;
    }
}

五、throw 和 throws 的区别?

throw:

表示方法内抛出某种异常对象
如果异常对象是非 RuntimeException 则需要在方法申明时加上该异常的抛出 即需要加上 throws 语句 或者 在方法体内 try catch 处理该异常,否则编译报错
执行到 throw 语句则后面的语句块不再执行
throws:

方法的定义上使用 throws 表示这个方法可能抛出某种异常
需要由方法的调用者进行异常处理

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值