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

发布于:2024-12-06 ⋅ 阅读:(22) ⋅ 点赞:(0)

在 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 的对比

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

小结

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

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

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

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

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

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

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


网站公告

今日签到

点亮在社区的每一天
去签到