异常类

java.lang.Throwable

在Java中 所有异常都有一个共同的祖先java.lang包中的Throwable类

Throwbale 包含两个重要子类 Exception(异常) Error(错误)

Error

Error 是程序无法处理的错误信息 表示代码运行时JVM(Java虚拟机)出现的问题 如: OutOfMemoryError
这些异常发生时 JVM一般会选择线程终止

Exception

运行时异常(RuntimeException)
编译时异常
编译时异常 需要保证在运行之前给出一个处理方案

异常处理

异常默认处理流程

try-catch

好处: 异常对象可以被捕获 后续的代码可以继续执行

格式:

1
2
3
4
5
try{
可能会出异常的代码
} catch(异常名称 对象名){
异常的处理方案
}

执行流程:

  1. 执行try{} 中的代码 看是否有异常对象产生
  2. 没有: catch就不会捕获 后续代码继续执行
  3. 有: catch捕获异常对象 执行catch{} 中的处理方案 后续代码继续执行部

如果要捕获多个异常那么最大的异常一定要最后 否则编译器会报错 例如:Exception要放在最后一个catch中

抛出处理

  1. throws: 写在方法定义处 表示声明一个异常 告诉调用者 使用本方法可能会存在哪些异常
  2. throw: 写在方法内 结束方法 手动抛出异常对象 交给调用者 方法中下面的代码不再执行了

编译时异常必须用throws声明
throws 抛出异常但不处理异常

两种异常处理方式比较

根据正在面临的异常 是否需要暴露出来

  • 不需要暴露: try … catch 捕获 (通常对于用户)
  • 需要暴露: 抛出异常 (通常对于使用者)

问题

如果try中没有遇到问题 怎么执行

会把try里面所有的代码全部执行完毕 不会执行catch里面的代码
注意:
只有当出现了异常才会执行catch

如果try中可能会遇到多个问题 怎么执行

会写多个catch与之对应
细节:
如果我们要捕获多个异常 这些异常如果存在父子关系的话 那么父类一定要写在下面
了解性:
在JDK7之后 我们可以在catch中同时捕获多个异常 中间用 | 进行隔开
如果出现 A异常 | B异常的话 采取同一种处理方案

如果try中遇到的问题没有被捕获 怎么执行

相当于try…catch的代码白写了 最终还是会交给虚拟机进行处理

如果try中遇到了问题 那么try下面的其他代码还会执行吗

下面的代码就不会执行了 直接跳转到对应的catch当中 执行catch里面的语句体
但是如果没有对应catch与之匹配 那么最终还是会交给虚拟机进行处理

总结

常见异常方法

  1. public String getMessage() 返回次throwable() 的详细消息字符串
  2. public String toString() 返回此可抛出的简短描述
  3. public void printStackTrace()
    1. 在底层是利用System.err.println进行输出
    2. 把异常的错误信息以红色字体输出在控制台
    3. 细节 仅仅是打印西悉尼 不会停止程序运行