Trowable是所有异常的超类,对应的底下有两个子类,Error和Exception,java中的异常其实总体上来说有三种类型:

一、检查性异常,程序在编译的时候出现的异常,例如打开一个文件,此时程序需要抛出FileNotFoundException等相关异常,简单来说就是可预见的异常。

二、运行时异常,程序在运行时抛出的异常,与检查性异常相反,运行时异常在编译时是可以通过的,只有程序执行到异常代码时才抛出异常,例如角标越界,空指针异常等等。

三、错误,错误和异常是不同,错误其实是脱离了程序员控制的问题,错误在代码中经常被忽略。比如内存溢出,在编译过程也是发现不了的

 

常用的非检查性异常:

ArrayIndexOutOfBoundsException:用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。

IllegalArgumentException:抛出的异常表明向方法传递了一个不合法或不正确的参数。

IndexOutOfBoundsException:指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。

NullPointerException:当应用程序试图在需要对象的地方使用 null 时,抛出该异常

NumberFormatException:当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。

 

常用的检查性异常:

ClassNotFoundException:应用程序试图加载类时,找不到相应的类,抛出该异常

NoSuchFieldException:请求的变量不存在

NoSuchMethodException:请求的方法不存在

 

异常中常用的方法:

异常中的方法其实平时开发的时候使用的比较少,默认的try catch中会有有e.printStackTrace();如果是自定义异常的话,可以初始化参数,通过定义的方法取值,下边列举一下基本方法:

public String getMessage()    返回关于发生的异常的详细信息。这个消息在Throwable 类的构造函数中初始化了

public Throwable getCause()  返回一个Throwable 对象代表异常原因。

public void printStackTrace()  打印toString()结果和栈层次到System.err,即错误输出流

public StackTraceElement [] getStackTrace()  返回一个包含堆栈层次的数组。下标为0的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底。

 

捕获异常:

try
{
   // 程序代码
}catch(ExceptionName e1)
{
   //Catch 块
}

程序中对需要保护的代码,可以使用try-catch,当try 中的代码块有异常发生时,并且catch中包含对应的异常,那么异常就会进入到catch 代码块中去,catch是可以进行
多重捕捉的,根据不同的异常匹配进入不同的catch块中,有时候为了方便只用使用了Exception超类作为类型,只需要一个catch代码块

throws 和 thorw关键字的使用:

一个方法中,如果一个检查性的异常没有进行捕获,那么就需要在方法的尾部通过throws关键字将异常抛出,可一个自己手动的在代码中使用throw 一个异常,throws后可以跟上多个异常,使用逗号隔开

finally 关键字的使用:

finally 中的代码块是在try之后执行,不管是否发生了异常,finally中的代码块都会执行,比如进行io流操作时,最终都会关闭流,一般都是放在finally中执行,即使发生异常了,流也要关闭,不然io资源一直被占用,造成了资源的浪费

try-catch-finally 使用的细节:

  • catch 不能独立于 try 存在。
  • 在 try/catch 后面添加 finally 块并非强制性要求的。
  • try 代码后不能既没 catch 块也没 finally 块。
  • try, catch, finally 块之间不能添加任何代码

自定义异常:

    一般项目开发中,根据业务的需要可能需要自己去定义不同的异常,如果说想定义一个检查性的异常,就继承Exception,如果想定义一个非检查性的异常就继承RuntimeException类,这里其实有个坑,之前写个需求,账户余额问题,不足的话抛出了一个自定义的异常,一开始继承的是Exception,异常正常抛出,但是事物没有回滚,后来查了下,spring aop 异常捕获只对RuntimeException进行捕获,所以改成RuntimeException事物正常回滚;