java 异常机制学习笔记

java 异常机制学习笔记

Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws

try      执行可能产生异常的代码
catch       捕获异常
finally      无论代码是否发生异常,代码总能运行
throws    声明方法可能要抛出的各种异常
throw     手动抛出异常

try-catch

1.try块中没有出现异常
           :不执行catch块代码,执行catch后代码

2.try块中出现异常,catch中异常类型匹配(相同或者父类)
           :执行catch块代码,执行catch后代码

3.try块中代码出现异常,catch中异常类型不匹配
           :不执行catch块代码,不执行catch块后边的代码,程序会中断运行

注意:
     出现异常后,Java会生成相应的异常对象,Java系统寻找匹配的catch块,找到后将异常对象付给catch块异常参数
     出现异常后,try块中尚未执行的语句不会执行
出现异常后并处理后,catch块后面的语句还会执行

catch块处理异常:
     输出用户自定义异常信息

    调用异常对象的方法输出异常信息
        toString ( )方法,显示异常的类名和产生异常的原因
        void printStackTrace() 输出异常的堆栈信息
       String getMessage()返回异常信息描述字符串,是printStackTrace()输出信息的一部分

继续向上抛出异常
        throw e

异常类型:

在这里插入图片描述

try-catch-finally

在try-catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行

                     无异常 try-finally
                     有异常 try-catch-finally

通常在finally中关闭程序块已打开的资源,比如:文件流、释放数据库连接等。

finally块中语句不执行的唯一情况
                     异常处理代码中执行System.exit(1)退出Java虚拟机

Finally块的具体执行过程
                     执行try或catch中代码
                    遇到return/throw,先执行finally中语句块
                    执行return/throw

  *多重catch
         一段代码可能会引发多种类型的异常
         当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个与异常类型匹配的catch语句
         执行其中一条 catch 语句后,其后 catch 语句将被忽略
         在安排catch语句的顺序时,首先应该捕获最特殊的异常, 然后再逐渐一般化,即先子类后父类(安排catch语句的顺序先子类后父类)

  *异常分类
      Error
          Error类层次描述了Java运行时系统内部错误和资源耗尽错误,一般指与JVM或动态加载等相关的问题,如虚拟机错误,动态链接失败,系统崩溃等。

          这类错误是我们无法控制的,同时也是非常罕见的错误。所以在编程中,不去处理这类错误。
          可以打开JDK包:java.lang.Error,查看他的所有子类
          注:我们不需要管理Error!

      Exception

          所有异常类的父类,其子类对应了各种各样可能出现的异常事件。

          Exception分类

                 运行时异常Runtime Exception(unchecked Exception)
                 可不必对其处理,系统自动检测处理
                一类特殊的异常,如被 0 除、数组下标超范围等,其产生比较频繁,处理麻烦,如果显式的声明或捕获将会对程序可读性和运行效率影响很大

                 检查异常Checked Exception
                 必须捕获进行处理,否则会出现编译错误

           声明异常throws
                 当Checked Exception产生时,不一定立刻处理它,可以再把异常Throws出去
                 如果一个方法抛出多个已检查异常,就必须在方法的首部列出所有的异常,之间以逗号隔开
                 子类声明的异常范围不能超过父类声明范围
                 父类没有声明异常,子类也不能
                 不可抛出原有方法抛出异常类的父类或上层类

          手动抛出异常throw
                  Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要手工创建 并抛出。
                  在捕获一个异常前,必须有一段代码先生成异常对象并把它抛出。这个过程我们可以手工做, 也可以由JRE来实现,但是他们调用的都是throw子句。
                  注意抛出运行时异常和Checked异常的区别
                      抛出Checked异常,该throw语句要么处于try块中,要么方法签名中throws抛出
                      抛出运行时异常,没有以上要求
                  在程序中,可能会遇到任何标准异常类都没有充分的描述清楚的问题,这种情况下可以 创建自己的异常类
                  从Exception类或者它的子类派生一个子类即可

                 习惯上,定义的类应该包含2个构造器:一个是默认构造器,另一个是带有详细信息的 构造器
     注意:
                 try-finally也是可行的格式
                 遇到了return和throw依旧执行finally语句;遇到System.exit()就不会 执行finally语句了
                 throw了运行时异常,则方法声明中不需要throws

发布了5 篇原创文章 · 获赞 21 · 访问量 4295

猜你喜欢

转载自blog.csdn.net/qq_35577787/article/details/105149037