异常层次结构
异常概念
- 定义
- 程序在运行过程中发生的,打断程序正常执行的事件
- 异常产生的原因
- 硬件错误,资源耗尽,输入错误
- 异常的传播
- 如果没有catch语句捕获异常,异常将调用栈一直向上传播,如果一直没有catch语句块捕获,
- 则最终传播到main方法,最后从main方法抛出,由JVM来处理
try,catch,finally语句块需要注意事项
- try语句块
- 当try语句块中有return语句,先要将finally语句块执行完毕才返回
- 当try语句块中有System.exit(0)语句,当执行完这条语句的时,JVM就停止了,后面都不执行
- catch语句块
- 我们可以使用多个catch块捕获异常,这时需要将父类型的catch块放在子类型catch块之后,
- 否则子类型catch块将无法到达,编译器会报编译错误
- finally语句块
- 可以保证无论抛出异常与否都保证程序继续执行
- 中断finally语句块的执行:
- finally语句块本身产生异常
- 执行finally语句块线程死亡
- finally语句块中执行了System.exit(0)
- 计算机断电
- catch和finally不能同时省略
Throwable
- 是所有异常类的超类
- 有两个直接子类Error和Exception
- Error
- 错误,程序出现错误我们不能处理
- Exception
- 异常,程序出现异常我们可以处理
捕获异常 VS 未捕获异常
- 捕获异常
- 是必须处理的异常
- 一般是由外界因素产生的,并且可以恢复的
- 未捕获异常
- 是不用必须处理的异常
- 继承Error代表硬件运行失败导致的严重错误,程序不能处理
- 继承RuntimeException通常是指一些程序运行时错误引起的异常,可以处理也可以不处理
- Exception的子类除去RuntimeException的子类称为捕获异常,其他的都是未捕获异常
Exception
- 重写的方法一定不能抛出新的捕获异常或者比原方法范畴更大的捕获异常
- 分类
- 运行时异常和非运行异常
- 运行时异常,可以不进行处理,推荐不处理
- 继承RuntimeException的类都是运行时异常
- 非运行时异常,必须进行处理,处理有两种方式捕获或者抛出
- 继承Exception但不继承RuntimeException的类都是非运行时异常
- Exception类几个能被继承的常用方法
- public void printStackTrace() 该方法将在控制台打印异常调用栈的信息
- public String toString() 该方法将返回该异常对象的字符串表示
- public String getMessage() 返回异常对象中携带的出错信息
throw VS throws
- throw: 方法体中,抛出一个异常对象
- throws: 方法声明时使用,用来指定可能抛出的异常,多个异常可以使用逗号隔开
自定义异常
- 自定义异常必须继承Exception
- 通常情况下,自定义异常编写两个构造器,一个无参的,一个以字符串做参数的构造器
- package com.itlwc;
- class MyException extends Exception {
- private static final long serialVersionUID = 1L;
- public MyException() {
- }
- public MyException(String str) {
- super(str);
- }
- }
- public class Test {
- public static void main(String[] args) {
- int a = 3;
- try {
- new Test().getSex(a);
- } catch (MyException e) {
- System.out.println("输入性别不合法");
- }
- }
- public String getSex(int a) throws MyException {
- if (a == 0) {
- return "男";
- } else if (a == 1) {
- return "女";
- } else {
- throw new MyException();
- }
- }
- }
- /*
- 打印结果:
- 输入性别不合法
- */