在程序运行过程中出现的错误,称为异常

异常分类

异常 - 图1

异常的捕获和处理

异常的捕获和处理是通过try…catch来实现的。

格式是:

  1. try {
  2. 编写异常代码;非异常的代码尽量不要放在这里
  3. }catch(OneException e) {
  4. }catch(TwoException e) {
  5. }finally {
  6. }
  • try 中包含了可能产生异常的代码
  • try 后面是 catch,catch 可以有一个或多个,catch 中是需要捕获的异常
  • 当 try 中的代码出现异常时,出现异常下面的代码不会执行,马上会跳转到相应的catch 语句块中,如果没有异常不会跳转到 catch 中
  • finally 表示,不管是出现异常,还是没有出现异常,finally 里的代码都执行,finally 和 catch 可以分开使用,但 finally 必须和 try 一块使用,如下格式使用 finally 也是正确的

获取异常对象的信息

  • 取得异常描述信息:getMessage()
  • 取得异常的堆栈信息(比较适合于程序调试阶段):printStackTrace();

声明异常/异常声明 throws

在方法定义的地方采用throws 声明异常,如果声明的异常为受控异常,那么调用方法必须处理此
异常 (通过try…catch方式来处理),非受控异常的方法,调用时是否进行异常处理并无要求,处理与否都可以。

手动抛异常 throw

在异常方法中通过手动抛异常来抛出方法异常的信息等。
例如:

  1. throw new IllegalArgumentException("除数为 0");

异常捕获顺序

从小到大

自定义异常

自定异常一般是继承于Exception 或 RuntimeException
继承于Exception的是受控异常,调用方法时要进行异常的处理
继承于RuntimeException的异常是非受控异常

自定义异常的步骤

1.编写一个类继承Exception 或 RuntimeException
2.在这个类中编写一个无参构造方法和一个参数为message的有参构造方法,这个有参构造方法要调用super(message)来调用父类的有参构造参数。
3.如果定义的方法是受控异常的,要先声明异常throws,然后手动抛出异常throw,在调用这个方法时,要用try…catch进行异常处理。
4.如果定义的方法是非受控异常,可以不用声明异常,调用方法时也可以不进行异常处理。

注:子类方法不能抛出比父类方法更多的异常,但可以抛出父类方法异常的子异常