Java里面异常Exception体系知识点

什么是异常,java出现异常的场景

  • 错误

    • 程序运行时发生的不被期望的事件,阻止了程序按照预期正常执行
    • 常见程序错误分三类
      • 编译错误:新手最常见,没遵循语法规范
      • 运行时错误:程序在执行时,
      • 逻辑错误:程序没有按照预期的逻辑顺序执行
    • Java异常分为两类:
      • 检查型异常(Checked Exception) :编译器强制要求程序员进行捕获处理的异常,如IOExceptionSQLException等。
      • 非检查型异常(Unchecked Exception) :编译器不要求强制捕获的异常,如RuntimeException及其子类。
  • 异常处理机制

    • Java提供了五个关键字来处理异常:trycatchfinallythrowthrows

      • try:包含可能出现异常的代码块。
      • catch:用于捕获try块中抛出的异常,并处理它。
      • finally:无论try块中的代码是否抛出异常,finally块中的代码都会被执行。它常用于关闭资源或进行清理工作。
      • throw :用于显式地抛出一个异常,需要是 new 异常类
      • throws :用于声明 一个方法可能会抛出的异常,但不处理它,即往外抛
    • 基本异常处理代码 public static void test1() { try { int result = 1 / 0; } catch (ArithmeticException e) { System.err.println("捕获到除数为0的异常:" + e.getMessage()); } finally { System.out.println("finally"); } }

    • 抛出异常

      • throws子句放在方法参数列表的右括号之后,一个方法可以声明抛出多个异常,多个异常之间用逗号隔开
      csharp 复制代码
      public static void divide(int dividend, int divisor) throws ArithmeticException {
          if (divisor == 0) {
              throw new ArithmeticException("除数不能为0");
          }
          System.out.println(dividend / divisor);
      }
  • 总结:当抛出一个被检查的异常,我们必须使用try-catch块来处理它,或者在方法声明中使用throws子句继续往外抛

Java内置异常体系分类和核心方法

简介:Java内置异常体系分类和核心方法讲解

  • Throwable类

    • Java.lang软件包中有一个java.lang.Throwable类,这个类是java中所有错误和异常的超类
    • Throwable类有两个子类,Error与 Exception
      • Error 错误:
        • 代表系统级别的错误,通常是JVM(Java虚拟机)相关的错误,如OutOfMemoryError(内存溢出错误)等。
        • 这些错误通常是不可恢复的,并且大多数应用程序不应该试图去捕获或处理它们。
      • Exception 异常:
        • 代表程序可能出现的问题,在编程时需要重点关注的。
        • Exception类又可以分为运行时异常(RuntimeException)和非运行时异常(即编译时异常或已检查异常)。
  • Throwable类(定义了一些用于处理错误和异常的核心方法)

    • public String getMessage()
      • 异常的详细信息 try { throw new Exception("This is a test exception"); } catch (Exception e) { System.out.println(e.getMessage()); }
    • public Throwable getCause()
      • 异常原因 Exception cause = new Exception("The cause of the problem"); Exception exception = new Exception("A problem occurred", cause); try { throw exception; } catch (Exception e) { System.out.println(e.getCause().getMessage()); }
    • public void printStackTrace()
      • 打印错误的堆栈信息,即错误输出流,可以看到错误原因和所在位置 try { throw new Exception("This is a test exception"); } catch (Exception e) { e.printStackTrace(); // 打印错误的堆栈信息 }
  • 运行时异常,不可查异常(RuntimeException子类

    • 是那些可能在Java虚拟机正常运行期间抛出的异常,但是编译器不会检查这类异常是否被处理
    • 如果编写了一个可能会抛出运行时异常的方法,不需要在方法签名中使用throws关键字来声明这个方法会抛出这些异常
    • 常见的运行时异常包括:
      • NullPointerException:当应用程序试图在需要对象的地方使用null时抛出。
      • ClassCastException 强制失败抛出异常
      • ArrayIndexOutOfBoundsException:当应用程序试图访问数组的非法索引时抛出。
      • ArithmeticException:当出现异常的算术运算条件时抛出,例如除以零。
  • 非运行时异常,可查异常(编译时异常或已检查异常,必须要在方法里面捕获或者抛出

    • 是那些编译器会检查是否已经被处理的异常。
    • 如果编写了一个可能会抛出非运行时异常的方法,必须在方法签名中使用throws关键字来声明这个方法会抛出这些异常。
    • 调用这个方法的代码也必须处理这些异常,或者使用throws关键字再次声明这些方法也可能会抛出这些异常。
    • 常见的非运行时异常包括:
      • ClassNoFoundException 应用程序试图加载类,找不到对应的类
      • IllegalAccessException 拒绝访问一个类的时候
      • NoSuchFieldExcetion 请求的变量不存在
      • NoSuchMethodException 方法不存在
      • IOException:当发生输入/输出错误时抛出。
      • SQLException:当使用JDBC(Java Database Connectivity)与数据库交互时,发生SQL错误或数据库访问错误时抛出。

java异常处理之多重捕获处理

  • 异常处理之多重捕获

    • 多重捕获(Multiple Catch)是Java异常处理中的一个重要概念,它允许在单个try块后面跟随多个catch块,

    • 捕获不同类型的异常,这种机制使得代码更加清晰和易于管理,特别是在处理多种可能的异常时。

    • 语法

      • 结构 :一个try代码块后面可以跟随多个catch代码块,每个catch代码块用于捕获并处理不同类型的异常。
      • 顺序catch代码块的顺序很重要。Java会按照catch代码块的顺序进行匹配,将更具体的异常类型放在前面
      • finally块
        • try/catch后面添加finally块是可选的,无论是否发生异常,finally代码块的代码总会被执行。
        • finally块通常用于执行清理操作,如关闭文件或数据库连接。
    • 例: public class MultipleCatchExample { public static void main(String\[\] args) { try { divide(1, 0); } catch (ArithmeticException e) { System.out.println("算数异常:" + e.getMessage()); } catch (NullPointerException e) { System.out.println("空指针异常" + e.getMessage()); } catch (Exception e) { System.out.println("其他类型的异常" + e.getMessage()); } finally { System.out.println("finally"); } }

      csharp 复制代码
          // 抛出异常
          public static void divide(int dividend, int divisor) {
              if (divisor == 0) {
                  throw new ArithmeticException("除数不能为0");
              }
              System.out.println(dividend / divisor);
          }
      }

java异常处理之自定义异常

  • 什么是自定义异常

    • 当前JDK内置的异常不满足需求,项目会出现特有异常
    • 自定义异常可以让业务更清晰
  • 如何进行自定义异常

    • 异常都是继承自Exception类,所以我们要自定义的异常也需要继承这个基类。
    • 定义一个新的异常类 :继承自ExceptionRuntimeException
    • 提供构造函数:提供一个或多个构造函数,这些构造函数可以接受一个描述异常详情的字符串,并传递给父类的构造函数。
    • (可选)添加其他方法:根据需要,还可以在自定义异常类中添加其他方法或字段。
  • 例:

    • 定义异常类 public class InvalidDataException extends RuntimeException { public InvalidDataException() { super(); }

      scss 复制代码
          public InvalidDataException(String message) {
              super(message);
          }
          
          public InvalidDataException(String message, Throwable cause) {  
              super(message, cause); 
          } 
      }
    • 当检测到无效数据时,创建一个新的InvalidDataException实例并抛出它 public class DataProcessor { public void processData(String data) throws InvalidDataException{ if (data == null) { throw new InvalidDataException("Invalid data:" + data); } System.out.println(data); } }

    • 调用processData方法的代码中使用try-catch块来处理 public class CustomExceptionDemo { public static void main(String\[\] args) { DataProcessor dataProcessor = new DataProcessor(); try { dataProcessor.processData(null); } catch (InvalidDataException e) { e.printStackTrace(); } } }

相关推荐
不负岁月无痕1 小时前
STL -- C++ 红黑树封装 Map 和 Set
java·c语言·开发语言·c++·面试
小园子的小菜1 小时前
Java核心基础:反射与泛型底层原理及实战用法详解
java·开发语言
淘源码A1 小时前
多院区集团化云PACS系统源码,原生兼容国产软硬件环境
java·云计算·源码·saas·pacs·医学影像系统
何中应1 小时前
主流 OpenJDK 发行版下载安装
java·oracle·jdk·openjdk
daad7771 小时前
记录vscode连接matlab启动环境搭建
java·vscode·matlab
2501_925963382 小时前
Hi3516 + WS73 SDIO Wi-Fi 适配笔记
java·开发语言
Wang's Blog2 小时前
Java框架快速入门:深入MyBatis-Plus高级DML操作(ID策略·逻辑删除·乐观锁)
java·数据库·mybatis
KaMeidebaby2 小时前
卡梅德生物技术快报|噬菌体筛选:噬菌体筛选工程化优化方案:基于侵染全链条参数调控与水环境应用验证
java·开发语言·人工智能·机器学习·spark
我命由我1234511 小时前
Android Studio - Android Studio 自定义预览尺寸
android·java·ide·java-ee·android studio·android-studio·android runtime