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
(类加载失败)
处理方式
处理检查异常有两种方式:
- 捕获处理:使用
try...catch
块捕获并处理。try { FileReader file = new FileReader("file.txt"); } catch (IOException e) { e.printStackTrace(); }
- 抛出异常:在方法声明中通过
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...catch
或 throws
明确处理;而运行时异常,则通过优化代码逻辑从根本上避免。
最后说一句(求关注,求赞,别白嫖我)
最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的 7701页的BAT大佬写的刷题笔记,让我offer拿到手软
本文,已收录于,我的技术网站 cxykk.com:程序员编程资料站,有大厂完整面经,工作技术,架构师成长之路,等经验分享
求一键三连:点赞、分享、收藏
点赞对我真的非常重要!在线求赞,加个关注我会非常感激!