Java-异常

1 异常的概述

1.1 什么是异常?

  • 异常就是程序出现了不正常情况 , 程序在执行过程中 , 数据导致程序不正常 , 最终导致了JVM的非正常停止

  • 注意 : 语句错误不算在异常体系中

1.2 异常的存在的形式

  • 异常有类型之分,比如我们之前有接触过的比较熟悉的数组越界异常(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException),类型转换异常(ClassCastException)。当程序中产生异常时,其实就是在异常的位置创建了一个该异常的对象,该对象携带了相关的异常信息。

    • 简单来说 : 异常就是Java中提供的类的对象

1.3 程序中异常产生后,是如何处理的

  • 程序中一旦产生异常,首先会中断向下执行。异常的传递要根据处理方式(后面章节会讲到)而定,如果没有处理,默认是将异常传递给本方法的调用者。不断往回传递,直到JVM收到该异常,此时程序终止执行

2 异常的分类

  • 编译时期异常

    • 非RuntimeException及其子类 : 编译时异常就是在编译的时候可能出现的异常, 编译时期必须处理,否则程序无法执行

  • 运行时期异常

    • RuntimeException及其子类 : 运行时异常就是在运行时可能出现的异常, 在编译时期不需要处理

3 异常的处理方式

3.1 JVM处理异常的方式

  • 如果程序出现了问题,我们没有做任何处理,最终JVM会做默认的处理 , 那么JVM是如何处理的呢 ?

    • 把异常的类型 , 原因 , 位置打印在控制台

    • 程序停止执行

  • 注意 : 程序中出现了异常 , 会在当前位置创建此异常的对象 , 对象中包含了异常的信息 , 并把此异常交给本方法的调用者处理

  • 缺点 : 用户体验不好

3.2 手动处理异常方式

3.2.1 声明异常
  • 声明异常—— throws

    • 修饰符 返回值类型 方法名(参数列表) throws 异常类型1 , 异常的类型2... { ... }

    • 举例 : public void show() throws NullPointerException , ArrayIndexOutOfBoundsException { .... }

  • 作用 :

    • 表示调用当前的方法可能会出现某些异常,使用时需要注意哦!

    • 如果当前方法没有出现任何异常, 那么代码会正常执行

    • 如果当前方法中出现了异常 , 会把异常交给本方法调用者处理(甩锅)

    • 3.2.2 抛出异常
    • 思考:
      • 以前出现了异常,虚拟机帮我们创建一个异常对象,抛给调用者。但是如果我们需要自己手动创建一个异常对象该如何写?

    • 格式 :
      • 修饰符    返回值类型    方法名(参数列表)  {
            throw new 异常对象();
        }
    • 注意 :
      • 抛出异常的格式必须在方法的内部完成

      • 如果手动抛出一个异常,下面的代码无法执行

    作用 :
    3.2.3 throws和throw的区别
    3.2.4 捕获异常

    3.3 Throwable 的成员方法

    方法名说明
    public String getMessage()返回此 throwable 的详细消息字符串
    public String toString()返回此可抛出的简短描述
    public void printStackTrace()把异常的错误信息输出在控制台

    4 自定义异常

    4.1 概述

    4.2 实现步骤

    4.3 自定义异常注意

    • 在方法中,当传递的参数有误,没有继续运行下去的意义了,则采取抛出处理,表示让该方法结束运行。

    • 告诉调用者方法中出现的问题原因

    • throws :

      • 用在方法声明后面,跟的是异常类名

      • 表示声明异常,告知调用者调用该方法有可能会出现这样的异常

    • throw :

      • 用在方法体内,跟的是异常对象名

      • 表示手动抛出异常对象,告知调用者数据传入有误

    • 捕获处理异常介绍 : try, catch

      • 之前的声明或者抛出都是将异常传递出去,让调用者知道异常信息。 而捕获处理是本方法内部进行处理 , 能够阻止异常的传递,从而保证程序能够继续往下执行。

    • 捕获异常的格式

      • try {
            try中存放可能会出现问题的代码
                1.代码...
                2.代码...
                3.代码...
        } catch (异常类型 变量名) {
                4.处理异常方案
               打印异常,获取异常原因记录日志......)
        }
        5.其他代码...
    • 执行方式

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

        • 从上往下依次执行 , catch中不执行

      • 如果 try 中代码2遇到了问题,问题下面的代码还会执行吗?

        • 不会执行,会拿当前异常对象和异常类型匹配,匹配成功执行处理异常代码

      • 如果出现的问题没有被捕获,那么程序如何运行?

        • 如果异常没有捕获到 , 虚拟机会帮助我们处理

    • 多异常捕获处理方案

      • 多个异常,每个异常单独处理

        • try{
              异常1
          }catch(异常1){
          ​
          } 
          try{
              异常2
          }catch(异常2){
          ​
          }
      • 多个异常,一次捕获,多次处理

        • try{
              异常1
              异常2
          }catch(异常1){
          }catch(异常2){
          }
      • 多个异常,异常一次捕获,一次处理

        • try{
              异常1
              异常2
          }catch(Exception e){
          }
    • 当JDK中的异常类型,不满足实际的业务需要时。就可以自己定义异常。例如,学生的年龄数据,如果是负数或者数据 超过了150认为是不合法的,就需要抛出异常。JDK中就没有表示年龄的异常,就需要自己定义异常了

    • 定义异常类

    • 写继承关系

    • 空参构造

    • 带参构造

    • 如果要自定义编译时异常,就继承Exception

    • 如果要自定义运行时异常,就继承RuntimeException

      // 自定义异常类,继承自 Exception
      class InvalidAgeException extends Exception {
          public InvalidAgeException(String message) {
              super(message);
          }
      }
      
      // 在一个示例类中使用自定义异常
      class Person {
          private String name;
          private int age;
      
          public Person(String name, int age) throws InvalidAgeException {
              if (age < 0 || age > 150) {
                  throw new InvalidAgeException("Age must be between 0 and 150.");
              }
              this.name = name;
              this.age = age;
          }
      
          public String getName() {
              return name;
          }
      
          public int getAge() {
              return age;
          }
      }
      
      // 测试类
      public class CustomExceptionExample {
          public static void main(String[] args) {
              try {
                  Person person1 = new Person("Alice", 25);
                  Person person2 = new Person("Bob", 200); // 这里会抛出 InvalidAgeException
              } catch (InvalidAgeException e) {
                  System.out.println("Invalid Age: " + e.getMessage());
                  e.printStackTrace();
              }
          }
      }
      

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值