当前位置: 首页 > article >正文

Java基础面试题12:Java中的两种异常类型是什么?它们有什么区别?

在 Java 中,异常是非常重要的一部分。理解异常的种类和它们的区别,是每个 Java 开发者都需要掌握的基础技能。


Java 中的异常分类

Java 中异常的根本来源是 Throwable 类,它包含了两大类:错误(Error)异常(Exception)

  • Error:程序无法处理的严重错误,例如内存溢出(OutOfMemoryError)。这种错误通常由 JVM 触发,程序员一般不需要处理。
  • Exception:可处理的异常。进一步细分为:
    • 运行时异常(RuntimeException):也叫非检查异常
    • 非运行时异常(CheckedException):也叫检查异常

错误(Error)

定义

Error 是一种程序无法控制的严重问题,表示 JVM 的底层出现了问题,比如动态链接失败、虚拟机崩溃等。

特点

  • 这些错误发生后,JVM 通常会直接中止线程,程序无法恢复。
  • 常见示例:
    • OutOfMemoryError(内存溢出)
    • StackOverflowError(栈溢出)

要点

Error 不应该被程序捕获或处理。通常只能提示用户错误发生并终止程序。


异常(Exception)

定义

Exception 是程序中可以通过代码进行捕获和处理的问题,分为两类:运行时异常(RuntimeException)检查异常(CheckedException)


运行时异常(RuntimeException)

定义

运行时异常是 RuntimeException 类及其子类的实例。这些异常往往是由于代码逻辑问题引起的,比如空指针访问、数组越界等。

特点
  • 非检查异常:编译器不会强制要求你处理它们。
  • 通常在程序运行时发生,程序员可以选择捕获,也可以不捕获。
  • 常见示例:
    • NullPointerException(空指针异常)
    • IndexOutOfBoundsException(数组/列表越界异常)
    • ArithmeticException(算术异常,比如除以 0)
处理建议
  • 运行时异常一般是因为程序逻辑错误导致的,所以需要从逻辑层面避免。
  • 比如:
    • 空指针异常:可以通过 Optional 或提前判断是否为空来避免。
    • 数组越界:应在访问前确认下标是否合法。

检查异常(CheckedException)

定义

检查异常是 Exception 类中除了 RuntimeException 外的所有异常。这类异常是程序员必须显式处理的。

特点
  • 检查异常:编译器会强制检查程序是否对其进行了捕获或声明。
  • 不能忽略,否则编译无法通过。
  • 常见示例:
    • IOException(I/O 操作异常,如文件未找到)
    • SQLException(数据库操作异常)
    • ClassNotFoundException(类加载失败)
处理方式

处理检查异常有两种方式:

  1. 捕获处理:使用 try...catch 块捕获并处理。
    try {
        FileReader file = new FileReader("file.txt");
    } catch (IOException e) {
        e.printStackTrace();
    }
    
  2. 抛出异常:在方法声明中通过 throws 关键字抛出,让调用者处理。
    public void readFile() throws IOException {
        FileReader file = new FileReader("file.txt");
    }
    
设计哲学

Java 认为这些异常是可预见且必须处理的,因此强制要求程序员显式声明处理方案。这种机制提高了程序的可靠性。


CheckedException 和 RuntimeException 的对比

特性CheckedExceptionRuntimeException
检查要求编译时必须处理编译时不要求处理
常见场景文件操作、数据库访问空指针、数组越界、类型转换
解决方式显式处理(try…catch 或 throws)通过逻辑避免或根据需求选择性捕获
是否预期是,通常与外部资源交互(如文件、网络)时出现是,由程序逻辑错误引起

小结

  • Error:表示严重的系统问题,程序无法控制或恢复。
  • RuntimeException:表示程序逻辑问题,编译器不会强制检查,程序员需要自行优化代码来避免。
  • CheckedException:表示外部环境或特定场景下需要显式处理的异常,Java 设计哲学要求程序员明确解决方案。

**建议:**对于检查异常,尽量提前预判,并通过 try...catchthrows 明确处理;而运行时异常,则通过优化代码逻辑从根本上避免。

最后说一句(求关注,求赞,别白嫖我)

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的
7701页的BAT大佬写的刷题笔记,让我offer拿到手软

本文,已收录于,我的技术网站 cxykk.com:程序员编程资料站,有大厂完整面经,工作技术,架构师成长之路,等经验分享

求一键三连:点赞、分享、收藏

点赞对我真的非常重要!在线求赞,加个关注我会非常感激!


http://www.kler.cn/a/421385.html

相关文章:

  • 深入探讨锁升级问题
  • 机器学习周志华学习笔记-第13章<半监督学习>
  • Flink四大基石之State(状态) 的使用详解
  • Ollama是什么
  • Python 入门教程(2)搭建环境 | 2.4、VSCode配置Node.js运行环境
  • c++中成员变量初始化列表的使用
  • AttributeError: ‘DataFrame‘ object has no attribute ‘append‘的参考解决方法
  • Linux67 绑定网卡【bonding和team】
  • 技术速递|Java on Azure Tooling 10月更新 - Azure 函数托管身份支持,Java on Azure 工具指南推出
  • Swift 宏(Macro)入门趣谈(五)
  • 【Anaconda】Anaconda3 下载与安装教程(Ubuntu 22.04)
  • SQL语法——DDL
  • 一键生成后端服务,MemFire Cloud重新定义开发效率
  • 基于Matlab SEIR模型的传染病传播分析与防控策略模拟
  • Leetcode 每日一题 205.同构字符串
  • 114. UE5 GAS RPG 实现配置怪物生成
  • 量化交易系统开发-实时行情自动化交易-8.7.文华平台
  • 【开源】A060-基于Spring Boot的游戏交易系统的设计与实现
  • 从0开始学PHP面向对象内容之常用设计模式(中介,访问)
  • 晶圆制程setup的一些探讨
  • python笔记3
  • 单元测试报websocket bean创建失败
  • (1)spring security - 项目环境搭建及入门
  • 群控系统服务端开发模式-应用开发-短信工厂华为云短信开发
  • 警惕开源信息成为泄密源头
  • Android 硬件抽象层(HAL)全解析:智能设备硬件协同揭秘