异常

程序在运行过程中出现的特殊情况

  • 异常处理的必要性:任何程序都可能存在大量的未知问题、错误;如果不对这些问题进行正确处理,则可能导致程序的中断,造成不必要的损失。

异常的分类

Throwable:可抛出的,一切错误或异常的父类,位于java.lang包中。

  • Error: JVM、硬件、执行逻辑错误,不能手动处理。
  • Exception:程序在运行和配置中产生的问题,可处理。
    • RuntimeException:运行时异常,可处理,可不处理。
    • CheckedException:受查异常,必须处理。

异常的产生

  • 自动抛出异常:当程序在运行时遇到不符合规范的代码或结果时,会产生异常。
  • 手动抛出异常:语法: throw new异常类型(“实际参数”);
  • 产生异常结果:相当于遇到return语句,导致程序因异常而终止。

异常的传递

  • 异常的传递:按照方法的调用链反向传递,如始终没有处理异常,最终会由JVM进行默认异常处理(打印堆栈跟踪信息)。
  • 受查异常:throws声明异常,修饰在方法参数列表后端。
  • 运行时异常:因可处理可不处理,无需声明异常。

异常的处理

try {
	可能出现异常的代码
}catch(Exception e){
	异常处理的相关代码,如:getMessage()、printStackTrace()
}finally {
	无论是否出现异常,都需执行的代码结构,常用于释放资源。
}

常见异常处理结构

try{ } catch{ }
try{ } catch{ } catch{ }
try{ } catch{ } finally{ }
try{ } catch{ } catch{ } finally{ } try{ } finally{ }

注: 多重catch,遵循从子(小)到父(大)的顺序,父类异常在最后。

自定义异常

  • 概念:需继承Exception或Exception的子类,代表特定问题。
  • 经验:异常类型名称望文生义,可在发生特定问题时抛出对应的异常。
  • 常用构造方法:
    • 无参数构造方法
    • String message参数的构造方法

方法的重写

  • 带有异常声明的方法重写:
  • 方法名、参数列表、返回值类型必须和父类相同。
  • 子类的访问修饰符合父类相同或是比父类更宽。
  • 子类中的方法,不能抛出比父类更多、更宽的异常。

总结

  • 异常的概念:
    程享在运行过程中出现的特殊情况。
  • 异常的分类:
    • RuntimeException:运行时异常,可处理,可不处理。
    • CheckedException:受查异常,必须处理。
  • 异常的产生:
    • throw new异常类型(“"实际参数”);
    • 相当于遇到return语句,导致程序因异常而终止。
  • 异常的传递:
    • 按照方法的调用链反向传递,如始终没有处理异常,最终会由JVM进行默认异常处理(打印堆栈跟踪信息)。
  • 异常的处理:
    • try { }catch { } finally { }
  • 带有异常声明的方法重写:
    • 子类中的方法,不能抛出比父类更多、更宽的异常。

Q.E.D.


如人饮水、冷暖自知