扫盲!throw检查异常和非检查异常时的区别

Java异常处理详解
本文详细解释了Java中检查异常和非检查异常的区别,包括它们的应用场景。通过具体示例阐述了何时应使用检测性异常及非检测性异常,帮助开发者更好地理解和应用Java异常处理机制。

一、throw 检查异常和非检查异常的区别

如果抛出的异常对象是Checked异常(除了RuntimeException及其子类的其他Exception)

则要 (1)处于try块里被catch捕获或者(2)放在一个带throws声明的方法里;

如果抛出的是RuntimeException则既可以显示使用try…catch捕获也可以不理会它 

示例:

163341_57WT_2885163.png

163646_kfx0_2885163.png

163813_f9Iu_2885163.png

 

二、检测性异常、非检测性异常的应用场景

非检测性异常应用场景

调用代码不能继续执行,需要立即终止。出现这种情况的可能性太多太多,例如服务器连接不上、参数不正确等。这些时候都适用非检测异常,不需要调用代码的显式捕捉和处理,而且代码简洁明了。

检测性异常应用场景

调用代码需要进一步处理和恢复。假如将 SQLException 定义为非检测异常,这样操作数据时开发人员理所当然的认为 SQLException 不需要调用代码的显式捕捉和处理,进而会导致严重的 Connection 不关闭、Transaction 不回滚、DB 中出现脏数据等情况,正因为 SQLException 定义为检测异常,才会驱使开发人员去显式捕捉,并且在代码产生异常后清理资源。当然清理资源后,可以继续抛出非检测异常,阻止程序的执行。根据观察和理解,检测异常大多可以应用于工具类中。

 

参考:Java 异常处理的误区和经验总结

转载于:https://my.oschina.net/zjllovecode/blog/1619160

### Java 检查异常检查异常区别及用法 在Java中,异常分为两类:**检查异常(Checked Exception)** **检查异常(Unchecked Exception)**。这两类异常的主要区别在于编译器对它们的处理要求同。 #### 1. 检查异常(Checked Exception) 检查异常是指那些在编译必须被显式处理的异常。如果程序中抛出检查异常,那么必须通过以下两种方式之一进行处理: - 使用 `try-catch` 块捕获并处理异常。 - 在方法签名中使用 `throws` 声明该方法可能会抛出异常[^1]。 检查异常继承自 `Exception` 类,但包括 `RuntimeException` 及其子类。常见的检查异常有 `IOException`、`SQLException` 等[^2]。 #### 2. 检查异常(Unchecked Exception) 检查异常是指那些需要强制处理的异常。它们通常是由程序逻辑错误引起的,例如空指针访问或数组越界等。检查异常继承自 `RuntimeException` 类及其子类[^3]。 常见的检查异常包括但限于: - `NullPointerException`:尝试访问一个未初始化的对象。 - `ArrayIndexOutOfBoundsException`:数组索引超出范围。 - `NumberFormatException`:字符串转换为数字格式正确。 - `ArithmeticException`:算术运算中的法操作,如除以零[^4]。 #### 3. 主要区别 | 特性 | 检查异常(Checked Exception) | 检查异常(Unchecked Exception) | |-------------------|---------------------------------------------|--------------------------------------| | 继承关系 | 继承自 `Exception`,但包括 `RuntimeException` | 继承自 `RuntimeException` | | 编译器要求 | 必须显式处理或声明 | 需要显式处理 | | 示例 | `IOException`、`SQLException` | `NullPointerException`、`ArrayIndexOutOfBoundsException` | #### 4. 用法示例 ##### 检查异常的用法 以下代码展示了如何处理检查异常 `FileNotFoundException`: ```java import java.io.File; import java.io.FileNotFoundException; public class CheckedExample { public static void main(String[] args) { try { File file = new File("example.txt"); if (!file.exists()) { throw new FileNotFoundException("File not found: " + file.getName()); } } catch (FileNotFoundException e) { System.out.println("Error: " + e.getMessage()); } } } ``` ##### 检查异常的用法 以下代码展示了检查异常 `ArrayIndexOutOfBoundsException` 的发生: ```java public class UncheckedExample { public static void main(String[] args) { int[] numbers = {1, 2, 3}; try { System.out.println(numbers[5]); // 引发 ArrayIndexOutOfBoundsException } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Error: " + e.getMessage()); } } } ``` #### 5. 总结 检查异常检查异常的核心区别在于编译器是否强制要求处理这些异常检查异常的设计目的是为了提醒开发者注意可能发生的错误,并提供明确的处理机制;而检查异常通常是由程序逻辑错误引起的,应该从逻辑角度尽可能避免发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值