首页 > 编程语言 >Java 异常分类

Java 异常分类

时间:2024-10-31 22:57:51浏览次数:3  
标签:Java 错误 RuntimeException 分类 程序 编译器 异常

总结自:《Java 核心技术第 10 版》

下图是 Java 异常层次结构图:

epub_27651657_1102

所有的异常都是由 Throwable 继承而来(注意 Throwable 是而不是接口),Error 和 Exception 是 Throwable 的直接子类。

Error 类用于描述 Java 运行时系统的内部错误和资源耗尽错误(比如 OOM)。应用程序不应该抛出这种类型的对象。如果出现了这样的内部错误,除了通告给用户,并尽力使程序安全地终止之外,再也无能为力了。这种情况很少出现。

在编写 Java 程序时,需要关注 Exception 层次结构。这个层次结构又分解为两个分支:一个分支派生于 RuntimeException;另一个分支包含其他异常。划分两个分支的规则是:由程序错误导致的异常属于 RuntimeException;而程序本身没有问题,但由于像 I/O 错误这类问题导致的异常属于其他异常。

派生于 RuntimeException 的异常包含下面几种情况:

  • 错误的类型转换
  • 数组访问越界
  • 访问 null 指针

不是派生于 RuntimeException 的异常包括:

  • 试图在文件尾部后面读取数据
  • 试图打开一个不存在的文件
  • 试图根据给定的字符串查找 Class 对象,而这个字符串表示的类并不存在

“如果出现 RuntimeException 异常,那么就一定是你的问题”[1]是一条相当有道理的规则。应该通过检测数组下标是否越界来避免 ArrayIndexOutOfBoundsException 异常;应该通过在使用变量之前检测是否为 null 来杜绝 NullPointerException 异常的发生。

但即使先检查文件是否存在再尝试打开文件,这个文件也还是有可能在你检查完它是否存在之后被删除导致出错。因此,“是否存在”取决于环境,而不只是取决于你的代码。所以“找不到文件”这类异常属于其他异常。

Java 语言规范将派生于 Error 类或 RuntimeException 类的所有异常称为非受查(unchecked)异常,所有其他的异常称为受查(checked)异常。编译器会检查是否为受查异常提供了异常处理器,没有则编译不通过。也就是说,方法抛出 RuntimeException 类及其子类的对象时,编译器允许程序不做任何处理——可以既不在方法中添加 throws 语句,也可以不用 try-catch 来处理;而对于继承自 Exception 及其子类的其他异常,编译器则会要求必须用 throws 或者 try-catch 语句来处理。

另:RuntimeException 这个名字很容易让人混淆。实际上,现在讨论的所有错误都发生在运行时。

参考:Java 中的异常体系、《Java 入门 1·2·3》


  1. 在实际开发过程中,也会在程序校验不通过时主动抛 RuntimeException(比如用 IllegalArgumentException 表示传参错误)给全局异常处理器处理,这种情况下算不上程序有问题。 ↩︎

标签:Java,错误,RuntimeException,分类,程序,编译器,异常
From: https://www.cnblogs.com/Higurashi-kagome/p/18012872

相关文章

  • 【JavaEE】【多线程】进阶知识
    目录一、常见的锁策略1.1悲观锁vs乐观锁1.2重量级锁vs轻量级锁1.3挂起等待锁vs自旋锁1.4普通互斥锁vs读写锁1.5可重入锁vs不可重入锁1.6不公平锁vs公平锁二、synchronized特性2.1synchronized的锁策略2.2synchronized加锁过程2.3其它优化措施三、......
  • JavaScript语法基础——变量,数据类型,运算符和程序控制语句(小白友好篇,手把手教你学会!)
     一、JavaScript概述JavaScript是一种高级编程语言,常用于网页开发和服务器端应用程序。它是一种动态类型语言,可以在浏览器中直接解释执行,而不需要编译。脚本(Script)是一种与计算机程序相关的指令集或代码块,用于执行特定的任务或操作。脚本通常用于自动化重复性的任务或进行特......
  • 关于visual stdio 2022代码在win11上运行异常缓慢的解决方案分享
        此篇博客记录笔者解决visualstdio2022运行c语言异常缓慢的解决方案。    起初我上网查资料得知可能是我的模块加载太多了,但是在禁用了额外的模块依然异常缓慢,我就继续查找资料,于是发现另一篇博客反应了和我一样的问题,他的解决方案是关闭联想自带的安全......
  • Java面试题中高级进阶(JVM篇Java内存)
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!说说Java内存结构?说说对象分配规则?描述一下JVM加载class文件的原理机制?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘***12万字的java面试题整理***Java内存结构方法区和堆是所有线程共享的内存区域;而j......
  • Java常见面试题之事务
    博主介绍上海交大毕业,大厂资深Java后端工程师《Java全套学习资料》作者专注于系统架构设计和高并发解决方案和面试辅导阿里云开发社区乘风者计划专家博主@author[vx]vip1024p(备注java)ACID特性A:原子性,Atomictiy,事务是最小的执行单位,不允许分割,事务的原子性确......
  • 创建一个基于Java的图书馆管理系统
    1.需求分析明确系统的主要功能需求,例如:用户注册与登录图书信息管理(增删改查)借阅管理归还管理用户管理管理员管理功能2.技术选型确定使用的技术栈:后端:Spring,SpringMVC,MyBatis前端:HTML,CSS,JavaScript(可选框架如Vue.js或React.js)数据库:MySQL服务器:Tomcat3.......
  • Java基础篇(四)(超详细整理,建议收藏!!!)
    目录 五、数组5.1 数组的概念5.2 数组声明5.3 数组创建与初始化5.3.1 使用new创建数组5.3.2 创建数组的三种方式5.3.3 创建数组需要注意的问题5.4 数组操作5.5 数组排序5.5.1 排序(冒泡)5.5.2 Arrays.sort() 5.6  Arrays工具类5.6.1排序(s......
  • Java多线程--Thread类的那些事3.--线程的6中状态和sleep()和 join()
      一.sleep()方法  首先在Thead类中有一个静态的sleep()方法,可以让线程进入到休眠状态即TEMD-WAITING状  在调用sleep()方法时需要注意的是在哪个线程里面调用sleep()方法,哪个线程就会进入阻塞状态.,在这个线程中的其他线程不会发生阻塞,只有当休眠时间到来这个......
  • 【面试题系列Java】Java基础面试题
    对于Java开发工程师而言,掌握Java基础、数据库、框架、Java虚拟机、Java并发编程等知识是必不可少的。以下是一些常见的Java开发工程师面试题及答案,供大家参考。博主介绍上海交大毕业,大厂资深Java后端工程师《Java全套学习资料》作者专注于系统架构设计和高并发解决方......
  • java字符串中得到某个字符,字符串的遍历,截取,替换
    有点详细,请耐心找您需要的看,谢谢!1得到某个字符2:字符串的遍历3:字符串的截取4:字符串的替换//以上根据实际需要输入字符常量时别忘了带""变量就直接输入;......