Java中的异常处理


在Java当中,所有的异常都有一个共同的祖先java.lang包中的Throwable类。

Throwable:当中有两个重要的子类:Exception(异常)和Error(错误)。二者都是Java异常处理的重要子类,各自都包含有大量的子类。其中最为重要的两个子类:Exception(异常)和Error(错误),二者都是Java当中异常处理的重要子类。
在这里插入图片描述

Error(错误)

这个是程序无法处理的错误,表示运行应用程序中较为严重的问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时JVM出现的问题。

例如:Java虚拟机运行时错误(Virtual MachineError),当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常发生时,Java虚拟机一般会选择线程终止。

这些错误表示故障发生于虚拟机自身,或者发生在虚拟机视图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它的应用程序来说,即使确实发生错误,本质上也不应该视图去处理它所引起的异常状况,在Java中,错误是通过Error的子类来描述的。

Exception

表示程序可以处理的异常,可以捕获且可能恢复,遇到这类异常,应该尽可能处理异常,是程序恢复允许,而不应该随意终止异常。

异常又分为编译期异常和运行时异常。

编译期异常通常是会在编译期间就会对我们写的代码进行一个校验,提示。
运行时异常是代码在执行的时候,遇到异常,在会给我们进行报错。

常见的Exception

java.lang.NullPointerException 空指针异常;
出现原因:调用了未经初始化的对象或者是不存在的对象。

java.lang.ClassNotFoundException 指针的类找不到
出现原因:类的名称和路径加载错误;通常都是程序试图通过字符串来加载某个类时可能引起异常。

java.lang.NumberFormatException 字符串转数字异常
出现原因:字符串数据中包含非数字型字符

java.lang.IndexOutOfBoundsException 数字角标越界异常
出现原因:常见于操作数组对象时发生

java.lang.illegalArgumentException方法传递参数错误

java.lang.ClassCastException 数据类型转换异常

java.lang.NoClassDefFoundException 未找到类定义错误

SQLException SQL异常,常见于数据库时的SQL语句错误

java.lang.InstantiationException 实例化异常

java.lang.NoSuchMethodException 方法不存在异常

异常的处理

try-catch-finally

try块:用于捕获异常。其后可以接0个或者多个carch块,如果没有catch块,则就必须跟一个finally块。

catch块:用于处理try捕获到的异常。

finally块:无论是否捕获或处理异常,都会执行finally块里面的语句
但是当在try块或catch块里面遇到return语句时,finally语句块也就将不会在执行的。

但是finally也会有不执行的时候:

  1. 当在finally语句块第一行发生异常的时候,也就不会向下执行了
  2. 在前的代码里面使用了System.exit(int)表示已经退出来程序。exit是带参的函数;若该语句在异常语句之后,finally就会执行了。因为异常出现,表示在try块里面异常之后的代码以及停止执行了。
  3. 程序所在的线程会死亡。
  4. 关闭CPU

注意: 当 try 语句和 finally 语句中都有 return 语句时,在⽅法返回return之前,finally 语句的内容将被执⾏,并且 finally 语句的返回值将会覆盖原始的返回值直接返回出去的,不在执行try里面的return语句。如下:
在这里插入图片描述

当然上面例子当中的try-finally语句也是可以书写的,在当中没有做异常处理,所以当发生异常的时候,执行finally里面的语句,然后抛出异常。

throws和throw

throws是用于方法的声明处,用来声明该方法可能发生的异常类型,也可以多个异常的类型,让它的 使用者都知道需要捕获的异常都有哪些类型。
它表示出来的异常只是表示是一种可能性,并不一定发生的。
当然的在抽象方法当中也是可以使用throws关键字的
和try-catch的意义一样,对异常的处理,throws是表示将异常抛给调用它的父类来解决这个异常的。

import java.io.UnsupportedEncodingException;

public class Demo02 {
    public static void main(String[] args) {
        try {
            demo1();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

    }
    public static void demo1() throws UnsupportedEncodingException {
        String s = "星辰与晨曦";
        s.getBytes("gbk");
    }
}

一般的位于底层的代码都是选择向上进行抛出

throw是用于方法当中,用来抛出一个实际的异常对象,由方法体内的语句进行执行。
在使用throw的时候也要注意到,在使用后要么使用try-catch捕获异常,要么使用throws来声明一下异常。
它表示的是具体向外抛出的动作,所以它抛出的是一个异常实例,执行throw一定是抛出了某种异常
在这里插入图片描述

用throw也可以理解为自己根据自己所写的需求,来抛出一个异常。

final、finally、finalize 的区别

final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。

finally:异常处理语句结构的一部分与try-catch搭配使用,表示不管异常怎么执行,finally里面的语句都是要执行的。

finalize:是Object 类的一个方法,在学到jvm的时候,就很明确了。
在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。该方法更像是一个对象生命周期的临终方法,当该方法被系统调用则代表该对象即将“死亡”,但是需要注意的是,我们主动行为上去调用该方法并不会导致该对象“死亡”,这是一个被动的方法(其实就是回调方法),不需要我们调用。(相对应的是,这个finalize依靠线程,随线程就灭了,所以它是极不可靠的,所以不建议使用)

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值