异常(exceptions)—— Java中的错误处理机制。每个抛出的对象都是Throwable的派生类。有两个主要类别:
Exception的子类,不包括RuntimeException):必须明确处理或在方法签名中通过throws声明。RuntimeException的子类):不需要明确处理,可以在任何地方发生(例如,NullPointerException)。何时使用?
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和数据丢失。