ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

学习异常处理完整篇

2022-05-18 13:36:12  阅读:117  来源: 互联网

标签:语句 try 学习 finally 完整篇 catch 异常 throw



/**
 * 异常处理
一 分类
 Throwable
     Error(不要处理Error错误)
         AWTError IOError LinkageError ThreadDeath
     Exception(分为两大类check和RuntimeException异常,它们都可以显式处理和throws声明处理)
         checked不是运行时异常的异常就是check异常,注意没有这个类,所以我故意首字母小写
            IOException SQLException ...
         RuntimeException(RuntimeException及其子类都是Runtime异常)
             IndexOutOfBoundsException  NullPointException ClassCastException .....
二 异常捕获的写法(try-catch-finally)
    (I) 简单写法 try{} catch(){}
    (II) 完整写法 try(){} catch(Exception e){//一个或多个catch代码块}....finally{}
     1  try代码块必要,大括号不可以省略
     2  catch代码块可以包含多个,但是异常对象捕捉,必须先小后大
     3  finally代码块 可有可无,看需要添加
     4  ()小括号 看需要添加,用于关闭物理资源
   注意:try代码块必要,而catch块和finally二选一或同时出现,try-catch-finally,不可以割裂看待和使用,要作为一体来看待

三 多异常捕捉(java7开始一个catch块可以捕捉多种类型的异常)
    1 多个异常用'|'竖线隔开
    2 捕捉多种类型的异常,异常变量有隐式的final修饰,因此不可以对异常变量重新赋值.
    3 多种类型的异常之间不可存在父子关系
        正常 catch(ClassCastException |  IndexOutOfBoundsException |NumberFormatException e ){}
        报错 catch(Exception | ClassCastException |  IndexOutOfBoundsException |NumberFormatException e ){}

四 访问异常信息(只能在catch块中通过异常对象来访问异常信息)
 所有的异常对象都给包含了如下方法
               String getMessage() 返回该异常对象的详细描述信息
                void  printStackTrace() 将该异常的跟踪栈信息输出到标准错误输出
                void  printStackTrace(PrintStream ps) 将该异常的跟踪栈信息输出指定输出
 StackTraceElement[]  getStackTrace() 返回该异常的跟踪栈

五 finally代码块
    起因: 垃圾回收机制不会回收任何物理资源,只会回收堆内存中的对象所占的内存
    注意:
        1 正常情况下finally语句永远可以得到执行,即使try块或catch块执行return或throw等方法退出的语句,现在知道为什么它叫finally了吧
        (System.exit(1)执行导致退出虚拟机除外,当然没人这么干,还是记住那句话,正常情况下finally语句永远可以得到执行)
        2 不要在finally块中使用return或throw等导致方法退出的语句.(因为这将导致try块或catch块的return,throw语句失效.)
        3 finally无法修改try或catch块中return返回的值和throw语句的内容,即使修改的return或throw语句中中变量的值也如此
        因为return返回的值已经被执行了,产生了一个结果x,此时才执行finally语句,最后返回x结果.
        (执行finally语句前return语句的返回值结果已经产生.throw抛出异常语句也是如此)

六 java9增强的自动关闭资源的try语句块(java7事实上已经有了自动关闭try语句块)
    写法: try(){}-catch-finally
    要求:
        1 要么在小括号里声明且初始化(java7)注意'且'字
        2 (推荐)要么在try自动关闭语句之前初始化,然后再try的小括号的声明一下即可,多个资源需要分号间隔(java9增强)
         java9解释: 资源变量必须为final的. 要么必须要么final显式声明类型,要么是隐式final修饰(小括号里声明即成了被隐式final修饰)
        3 可以包含catch语句或finally语句.(二选一或同时出现)
    注意:
        1 为保证正常关闭,这些资源类必须实现AutoCloseable或Closeable接口,事实上java的这些资源类已经实现了)
        2 自动关闭try语句块,其实相当于包含了隐式的finally语句块,所以它可以没有catch和finally,亦可以包含

七 check异常和Runtime异常
    check异常处理(3种)
         try-catch-finally,方法声明抛出(throws),throw手动抛出
    Runtime异常处理(3种)
          try-catch-finally,throw手动抛出,不处理让方法的调用者处理
 八 throws 方法签名上声明抛出异常
    1 用法: public void test()throws ClassCastException,IndexOutOfBoundsException,NumberFormatException{}
    2 方法重写时声明抛出异常的限制
        遵循方法重写的要求"两同两小一大",声明抛出异常类型要<=重写的方法抛出的异常类型.(注意没有对抛出异常类型的数量作要求)
九 使用throw手动抛出异常
    用法: throw new Exception("使用throw手动抛出异常");
    注意:
    1 java7开始 java编译器可以检查throw语句抛出的异常的类型,并提示提示警告出来
    实际上是,java编译器检查出的是捕捉异常对象时的编译类型,而不是实际类型
    解释: java编译器保存了异常对象a在捕捉时的编译类型A,如果throw手动抛出该对象时,则在编译时提示要处理该异常对象a,并显示出它的类型信息A
        如果有人在异常对象被捕捉前将类型A转为B类型.则java编译器检查异常对象为捕捉类型B.
        当然没人吃饱了饭这样干,去强转异常对象的类型.我们还是正常理解java编译器可以检查throw语句抛出的异常的类型就可以了.


十 自定义异常类型
    1 继承: 自定义异常继承Exception基类即可,如果自定义Runtime异常,继承RuntimeException.
    2 提供2个构造器 一个无参,一个带一个字符串的构造器,(字符串实参就是getMessage()返回的信息)
    3 调用父类构造器, 在字符串参数的构造器里,调用super构造器将字符串参数传入super(message)
十一 catch和throw同时使用
 catch捕捉异常,只是打印异常信息,并不处理异常,而通过throw处理异常.
 (两者配合处理异常.既打印了异常信息,又处理了异常-另外又捕捉到的异常.)

十二  异常链
 在定义一个异常类

运行结果如下:

我是定义异常对象,继承了RuntimeException
com.china.school.oop.MyException: 我是定义异常对象,继承了RuntimeException
    at com.china.school.oop.异常处理.main(异常处理.java:116)

标签:语句,try,学习,finally,完整篇,catch,异常,throw
来源: https://www.cnblogs.com/runwithtime/p/16284320.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有