【java基础】深入理解java异常处理机制

源:https://blog.csdn.net/hguisu/article/details/6155636 部分提取,不全

      开始时博主的例子,很值得一试:注意的是有finally但是报错的话catch里面的语句还是会执行的,嗯~例子略过了

JAVA异常:

       异常是一个事件,发生在程序运行期间,干扰正常的指令流程;

       Java通 过API中Throwable类的子类描述各种异常,所以Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件;

异常类层次结构图:

      all异常有一个共同祖先Throwable(可抛出)异常传播机制通过程序传输问题的共性;

     1、 Error:无法处理的错误、较严重的问题;在程序控制、处理能力之外,往往不可查,容许方法不捕捉;大多数错误表示运行时JVM出现的问题,发生时,JVM一般选择线程终止;

      2、Exception:程序可处理的异常,RuntimeException类及子类表示JVM常用操作引发的错误;           

               1)、运行时异常:RuntimeException及其子类;编译器不检查异常(代价有点大、犯不上),可以捕获处理也可不处理,由运行时系统自动抛出,一般由逻辑引起,如NullPointer、IndexOutOfBounds;

扫描二维码关注公众号,回复: 2495248 查看本文章

               2)、非运行时异常:其他的异常,必须处理否则编译不通过,IO/SQL及自定义的异常,又叫编译异常;

java异常分为:

        1)、可查异常:一定程度可预计它的发生;java编译器会检查此类异常,所以编译期必须处理,要么try-catch、要么throws抛出,否则编译不通过;

         2)、不可查:RuntimeException及其子类、Error

处理异常机制:先抛出后被捕捉

1、抛出异常

     异常:类型、出现时程序状态等

     多个用逗号分隔:throws new Exception1,new Exception2,..,new ExceptionN

     调用方法必须遵循任何可查异常的处理和声明规则。若覆盖一个方法,则不能声明与覆盖方法不同的异常。声明的任何异常必须是被覆盖方法所声明异常的同类或子类

2、捕获异常

       抛出异常后,运行时系统将为异常寻找合适的异常处理器:潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合,从发生异常的方法开始、依次回调栈中方法,当处理器所处理的异常类型与方法抛出的异常类型相符,找到合适的异常处理器方法并执行处理异常,如果未找到,抛给JVM处理,运行时系统终止;

 try-catch-finally:

      1、 try监控区域:监控可能发生的异常

       2、catch:异常抛出监控区外、运行时系统寻找匹配的catch子句捕获异常

                抛出的异常属于catch子句的异常类或其子类,那就安排上了,进入异常处理代码,try-catch语句结束,所以这个范围很重要,异常时刻、小辈当然要在前、遮风挡错,如果泥萌不清楚范围、放心、写错了会报错,如果不知道应该写什么异常类,发现会报红线给你提示、试不试狠智能;

                 

//处理ArithmeticException异常
catch (ArithmeticException e) { 
    //e变量名
    //getCause()抛出异常的原因。如cause不存在或未知null
    //getMeage():返回异常的消息信息
   //printStackTrace():对象的堆栈跟踪输出至错误输出流,作为字段 System.err 的值
}

        3、finally:无论如何、都不能抛弃必须执行的内容,当在try、catch中遇到return,会先执行finally再返回,现在要言行不一了,finally不会执行的情况:

                1)finally发生异常,2)前面用了System.exit退出程序,3)程序所在线程死亡,4)关闭CPU

   

try-catch-finally情况:

      1、catch中没有处理异常的块,此异常将抛给JVM,finally语句块还是会执行,不过后面的语句不会执行;

      

常见异常:见原文

猜你喜欢

转载自blog.csdn.net/ma15732625261/article/details/81316979