章节4-异常

122 阅读2分钟

继承体系结构

  • Throwable
    • Error : JVM层面的错误 , 比如栈溢出 , 堆溢出等
    • Exception
      • 运行时异常 : RuntimeException及其子类 ==> 编译时不报错,运行后若出现错误才会报错
      • 编译时异常 : 非RuntimeExcetpion及其子类 ==> 在编译时就会提示报错,需要程序员提前给出处理异常的方案
  • 异常中的方法都是在Throwable中声明的, 其子类异常没有自己声明方法
    • 构造方法

      • public Throwable(String message) {}
      • public Throwable(String message, Throwable cause){}
      • public Throwable(Throwable cause) {}
    • 常用方法

      • public String getMessage() 获取异常的错误原因
      • public void printStackTrace() 展示完整的异常错误信息

异常的处理方式

异常的默认处理流程
  1. 当程序抛出异常后 , 异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机 (一般往上抛 , 当抛到main方法时 , 由于main方法时 JVM 调用 , 此时 JVM 会捕获到异常)
  2. 虚拟机接收到异常对象后,先在控制台直接输出异常信息数据
  3. 终止 Java 程序的运行
异常处理方式 try...catch...
  • 代码示例:

  • try {
        System.out.println("请输入学生年龄");
        int age = Integer.parseInt(scanner.nextLine());
        student.setAge(age);
        break;
    } catch (NumberFormatException e) {
        System.out.println("输入有误,重新输入");
    } catch (Exception e) { //Exception e = new Exception("年龄不合法");
        e.getMessage();  //此时已经是用户层, 应该由内部处理异常, 不应该抛出异常了
    }
    
常处理方式 throws 抛出
  • throws:用在方法上,作用是声明,声明这个方法中有可能会出现异常

  • 代码示例

  • public void setAge(int age) throws MyException {  // throws Exception此时抛出异常是因为需要给被调用者一种警示
        //加入判断,年龄是否合法
        if (age < 0 || age > 120) {
            throw new MyException("年龄不合法");
        }
        this.age = age;
    }
    
throw与throws的区别
  • throw一般使用在方法体中, 后面跟的是异常对象. throw 抛出的是异常对象,执行throw一定抛出异常, 则程序终止, 所以throw 后代码都不会执行
  • 一般使用在方法签名上, throws只是一种预设, 让调用者知道该功能可能出现的问题, 方便调用者进行预设处理
异常的处理方式, 一般怎么选择?
  • 需要看使用方式 , 如果作为预警 , 则需要将问题暴露处理 , 给调用者提示 , 使其可以提前处理. 反之 , 则需要使用try...catch..处理

自定义异常

  1. 自定义编译时异常

    • 定义一个异常类继承Exception.
    • 重写构造器
  2. 自定义运行时异常

    1. 定义一个异常类继承RuntimeException.
    2. 重写构造器。