有如下所示代码:
public class Example037 { static void output1() { try { System.out.println("如果一个 catch 子句要捕获一个类型为 E 的被检查异常," + "而其相对应的 try 子句不能抛出 E 的某种子类型的异常,那么这就是一个编译期错误"); } catch (IOException e) { System.out.println(""); } } static void output2() { try { // 捕获 Exception 或 Throwble 的 catch 子句是合法的,不管与其相对应的 try 子句的内 容为何 } catch (Exception e) { System.out.println("This can‘ t happen"); } } interface Type1 { void f() throws CloneNotSupportedException; } interface Type2 { void f() throws InterruptedException; } interface Type3 extends Type1, Type2 { } static class Class01 implements Type3 { public void f() { System.out.println("一个方法可以抛出的被检查异常集合是它所适用的所有类型声明要抛出的被检查异常集合的交集," + "而不是合集。因此, 静态类型为 Type3 的对象上的 f 方法根本就不能抛出任何被检查异常。"); } } public static void main(String[] args) { output1(); output2(); Type3 t3 = new Class01(); t3.f(); } }
输出结果:
正如代码的输出字符串描述的那样,output1在编译期就报错了;output2能够正确执行,只是什么也不输出;t3.f()也可以正常执行。
分析总结:
output1说明一项基本要求,即对于捕获被检查异常的 catch 子句,只有在相应的 try 子句可以抛出这些异常时才被允许;output2说明了这项要求不会应用到的冷僻案例;t3.f()说明了多个继承而来的throws 子句的交集,将减少而不是增加方法允许抛出的异常数量。
注:本【java解惑】系列均是博主阅读《java解惑》原书后将原书上的讲解和例子部分改编然后写成博文进行发布的。所有例子均亲自测试通过并共享在github上。通过这些例子激励自己惠及他人。同时本系列所有博文会同步发布在博主个人微信公众号搜索“爱题猿”或者“ape_it”方便大家阅读。如果文中有任何侵犯原作者权利的内容请及时告知博主以便及时删除如果读者对文中的内容有异议或者问题欢迎通过博客留言或者微信公众号留言等方式共同探讨。
源代码地址https://github.com/rocwinger/java-disabuse
时间: 2024-10-13 21:28:56