编程后端Java开发工程师

在Java中,什么是异常(exceptions)?请解释checked异常和unchecked异常之间的区别,以及在什么情况下使用哪种类别。

用 Hintsage AI 助手通过面试

答案

异常(exceptions)—— Java中的错误处理机制。每个抛出的对象都是Throwable的派生类。有两个主要类别:

  • Checked exceptionsException的子类,不包括RuntimeException):必须明确处理或在方法签名中通过throws声明。
  • Unchecked exceptionsRuntimeException的子类):不需要明确处理,可以在任何地方发生(例如,NullPointerException)。

何时使用?

  • Checked — 用于可以处理的预期错误(例如,文件、网络错误)。
  • Unchecked — 用于表明程序缺陷的错误(例如,数组错误索引)。
代码示例
public void readFile(String path) throws IOException { // Checked exception — 需要处理 Files.readAllLines(Paths.get(path)); } public void divide(int a, int b) { int c = a / b; // Unchecked — ArithmeticException }

含有陷阱的问题

一个不声明throws的方法可以抛出checked exception吗?

答案: 不可以,编译器不允许在方法签名中未声明(throws)的情况下抛出checked exception。但unchecked exception可以在没有任何警告的情况下被抛出。

void foo() { throw new IOException(); // 编译错误 }

由于对主题细微差别的不理解导致的实际错误示例


故事

在网上银行中,客户决定忽视对SQLExceptions的处理,使用unchecked包装。从而在更新驱动程序时,隐蔽的错误导致了数据不同步。


故事

在日志应用中,日志文件由于未捕获的checked exception(FileNotFoundException)而被锁定,"在调用链中遗漏"该错误,未及时处理,导致应用无法再写入日志。


故事

在交易平台中,团队引入了全局catch(Throwable)以“永不崩溃”。最终,严重的unchecked exceptions被掩盖——应用程序在不一致的状态下继续运行,造成了复杂的bug和数据丢失。