异常的几种处理方式

目录

异常的声明

异常的处理

java虚拟机默认处理异常(默认处理方式)

手动处理异常的方式

异常的捕获


异常的声明

如果在某个方法中出现了编译时异常可以在当前方法上声明这个异常的类型,声明之后编译时异常就会消失

  • 注意

    • 异常的声明不能从根本上解决问题

    • 声明一个编译时异常类型之后,系统不会在编译期间检查这段代码,但是在运行阶段,如果传入的数据不正确,也有可能出现错误情况

    • 异常的声明只能处理编译时异常

异常的处理

java虚拟机默认处理异常(默认处理方式)

  • step1-->如果在代码中某个方法内出现了错误情况,系统就会把这个错误发生的原因,发生异常的类型,发生的路径封装到异常对象中

  • step2-->如果当前方法中没有处理这个异常对象,就将异常往上抛,抛给调用该方法的方法

  • step3-->如果调用方法也没有处理异常,那么久一层层往上抛出,直到抛给main方法再抛给虚拟机

  • step4-->虚拟机将当前异常对象通过标准错误流,打印到控制台,并结束自己

手动处理异常的方式

  • try...catch

    try{ 可能出现错误的代码 }catch(异常类型 异常对象名){ 处理异常的方式 }

    • step1-->先执行try中的代码,检测是否出现异常

    • step2-->如果try中的代码没有出现问题,try...catch直接结束,代码正常执行try...catch后面的代码

    • step3-->如果try中出现了异常,程序立即跳转到catch中查看出现异常所属类型和catch中声明的类型是否一样,如果一样,就捕获该异常按照指定的方式去处理异常,处理之后try...catch结束,程序继续运行

    • step4-->如果try中出现了catch中没有声明的异常类型,就不能捕获该异常,此时虚拟机来处理这个异常(默认处理方式)

    • 注意事项

      • 如果在某行代码中,出现了异常,立即去catch块中匹配异常类型,出现错误的代码后面的代码就不能执行了

  • try...catch...catch...

    try{ 可能出现错误的代码 }catch(异常类型1 对象名1){ 异常1的处理方式 }catch(异常类型2 对象名2){ 异常2的处理方式 }...

    • step1-->先执行try中的代码,检测是否出现异常

    • step2-->如果出现了异常,就先和异常类型1匹配,如果能匹配上就执行异常1的处理方式,处理之后,直接结束整个try...catch语句,执行之外的代码

    • step3-->如果不能和异常类型1匹配,就继续和异常类型2匹配,如果能匹配上,就执行异常类型2的处理方式,之后结束整个try...catch语句,执行之外的代码

    • step4-->如果异常类型2不能匹配,依次类推,往后匹配

    • step5-->如果出现的异常,catch中的类型都不能匹配,虚拟机默认处理

    • 注意事项

      • 如果给定了多个catch语句去匹配多个异常类型,异常类型中存在子父类的关系,腹肌的异常类型不能1定义在子级异常类型前面

        • 原因

          • 如果父类异常定义在前面,后面定义的子类或者简介子类异常没有执行的机会,可以将父类异常类型定义在后面,如果前面的类型无法匹配,可以使用父类异常匹配

      • 如果多个异常类型想要执行一种处理方式,可以使用 | 符号去定义类型(jdk1.7),可以使用多个 | 来定义多个异常类型,只要出现一种,都可以去捕获处理

  • try...catch...finally

    try{ 可能会发生错误的代码 }catch(异常类型 异常对象名){ 异常的处理方式 }finally{ 一定要执行的代码 }

    • step1-->先执行try中的代码,检测是否出现异常

    • step2-->如果出现异常就先和异常类型匹配,如果能匹配上就执行异常的处理方式,处理之后结束整个try...catch语句,执行之外的代码

    • step3-->如果不能和异常类型,不结束整个try...catch,强制执行finally代码块中的代码,然后再结束

    • 使用原因

      • 有些代码一定要执行,将代码放在try中或者catch中或者terycatch外都有可能执行不到

      • 将这段代码放在finally块中,不管遇到什么情况,系统都会去执行finally中的代码

  • try...finally

    • step1-->执行第一段代码

    • step-->执行第二段代码

    • 作用

      • 如果在程序中,有多段代码,多段代码都需要有执行的机会,name可以将这多段代码,分别放在try中和finally中,这样,多段代码之间就会互不影响,都有执行的机会,finally用来分隔代码,让代码之间互不影响,都有执行的机会

异常的捕获

  • 如果代码的某个位置出现了错误情况,可以使用特定的格式,捕获这个错误,捕获之后可以按照自己定义的方式去处理异常

  • 注意

    • 异常的捕获即可以处理编译时异常,也可以处理运行时异常

    • 可以从根本上解决问题

你可能感兴趣的:(技术栈,工作总结,异常)