JAVA异常体系

[复制链接]
发表于 2025-9-2 00:08:09 | 显示全部楼层 |阅读模式
在 Java 里,异常体系是其错误处理机制的核心内容,它能够帮助开发者有用应对程序运行时出现的各种意外状况。
异常体系的基本架构

它主要包含两个紧张分支:

  • Error(错误):这类异常是程序自身无法处理的严峻问题,像OutOfMemoryError和StackOverflowError就属于此类。一般而言,开发者不需要针对这类异常编写特殊的处理代码
  • Exception(异常):这是程序在运行过程中能够捕获和处理的异常。它又可以进一步细分为:

    • 受查抄异常(Checked Exception):这类异常在编译阶段就会被查抄,比方IOException和SQLException。程序必须对它们进行捕获或者声明抛出。
    • 运行时异常(RuntimeException):也被称作非受查抄异常,像NullPointerException和ArrayIndexOutOfBoundsException都属于此类。编译时不会欺压要求处理这类异常。
           
 

 Error

在 Java 中,Error是Throwable类的子类,用于表示系统级的严峻故障,通常无法通过程序规复。
一、特点


  • 不可规复:表示 JVM 或系统级的严峻问题,程序通常无法处理。
  • 不欺压捕获:编译器不会查抄 Error,也不要求代码处理它。
  • 克制捕获:捕获 Error 大概导致程序进入不稳固状态。
二、常见的 Error 类型

1. 内存相关错误

OutOfMemoryError:内存不敷,无法分配对象。
  1. // 示例:创建过大的数组可能导致OutOfMemoryError
  2. byte[] array = new byte[Integer.MAX_VALUE];
复制代码
 StackOverflowError:方法调用栈深度高出限制(常见于递归无停止条件)。
  1. // 示例:无限递归导致StackOverflowError
  2. public void recursive() {
  3.     recursive(); // 最终栈溢出
  4. }
复制代码
2. 类加载相关错误


  • NoClassDefFoundError:编译时存在的类,运行时找不到(如依赖库缺失)。
  • ClassFormatError:类文件格式错误(如.class 文件损坏)。
3. JVM 内部错误


  • InternalError:JVM 内部发生错误(如 JIT 编译器故障)。
  • VirtualMachineError:JVM 瓦解或无法继承运行的严峻错误。
Exception


受查抄异常(Checked Exception)

特点


  • 在编译阶段就会被编译器查抄。
  • 程序必须对这类异常进行处理,处理方式有两种:要么使用try-catch语句捕获,要么在方法签名中用throws声明抛出
  • 一般是由程序外部的因素引发的,好比文件系统、网络或者数据库等出现问题。

常见示例


  • IOException:在进行输入输出操作时,如果出现错误,就会抛出此异常。比方,实验读取一个不存在的文件时。
  • SQLException:在访问数据库时,如果出现错误,会引发该异常。好比 SQL 语句实行失败。
  • ClassNotFoundException:当使用反射机制加载类,却找不到指定的类时,会产生此异常。
  • InterruptedException:当一个线程被另一个线程中断时,会抛出此异常。
处理方式 
  1. import java.io.FileInputStream;
  2. import java.io.IOException;
  3. public class CheckedExceptionExample {
  4.     public static void main(String[] args) {
  5.         try {
  6.             readFile(); // 必须捕获或声明抛出
  7.         } catch (IOException e) {
  8.             e.printStackTrace();
  9.         }
  10.     }
  11.     public static void readFile() throws IOException {
  12.         FileInputStream file = new FileInputStream("non_existent_file.txt");
  13.     }
  14. }
复制代码
运行时异常(RuntimeException)

特点


  • 属于RuntimeException的子类
  • 编译时不会欺压要求处理这类异常,也就是说可以不捕获,也不用在方法签名中声明。
  • 通常是由程序中的逻辑错误导致的,好比空指针引用、数组越界等
常见示例


  • NullPointerException:当实验访问空对象的方法或属性时会抛出此异常
  1. String str = null;
  2. System.out.println(str.length()); // 抛出NullPointerException
复制代码
      2.ArrayIndexOutOfBoundsException:访问数组时,如果使用的索引超出了数组的有用范围,就会引发该异常。
  1. int[] arr = new int[5];
  2. System.out.println(arr[10]); // 抛出ArrayIndexOutOfBoundsException
复制代码
      3.ArithmeticException:进行数学运算时,若出现非法操作,好比除以零,就会抛出此异常。
  1. int result = 10 / 0; // 抛出ArithmeticException
复制代码
      4.IllegalArgumentException:当传入的参数不符合方法的要求时,会产生该异常。
  1. public void setAge(int age) {
  2.     if (age < 0) {
  3.         throw new IllegalArgumentException("年龄不能为负数");
  4.     }
  5. }
复制代码
 
 受查抄异常 vs 运行时异常

对比项受查抄异常(Checked Exception)运行时异常(RuntimeException)编译时查抄必须处理,否则编译不通过不欺压要求处理继承关系继承自Exception类(但不包括RuntimeException)继承自RuntimeException类常见场景外部资源访问(文件、网络、数据库等)程序逻辑错误(空指针、数组越界等)处理方式捕获(try-catch)或声明抛出(throws)可不处理,通过代码逻辑克制异常和错误的区别

对比项异常(Exception)错误(Error)计划目的表示程序可处理的意外情况,如文件不存在、网络中断。表示系统级不可规复的严峻故障,如内存溢出、栈溢出。处理要求受查抄异常必须被捕获或声明抛出;
                        运行时异常可选择性处理。通常不捕获,也不应该实验处理,而是让程序停止。常见子类IOException, SQLException, NullPointerExceptionOutOfMemoryError, StackOverflowError, NoClassDefFoundError代码示例java<br>try {<br> FileInputStream file = new FileInputStream("test.txt");<br>} catch (FileNotFoundException e) {<br> e.printStackTrace();<br>}<br>java<br>public void recursive() {<br> recursive(); // 终极导致StackOverflowError<br>}<br>


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表