【java解惑】关于异常捕获的三条要求

有如下所示代码:

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

【java解惑】关于异常捕获的三条要求的相关文章

Java多层的异常捕获

示例程序一: public class CatchWho { public static void main(String[] args) { try { try { throw new ArrayIndexOutOfBoundsException(); } catch(ArrayIndexOutOfBoundsException e) { System.out.println( "ArrayIndexOutOfBoundsException" + "/内层try-catch

Java基础:异常捕获顺序

public voidtestException(){ int a[] = {1,2,3};int q = 0; try{ for(int i=0;i<a.length;i++){a[i] /= q;} }catch(ArithmeticException h){ System.out.print("ArithmeticException\n"); //执行 }catch(Exception e){ System.out.print("Exception\n"

scala中异常捕获与处理简单使用

import java.io.IOException /** * 异常捕获与处理 */ object excepitonUse { def main(args: Array[String]): Unit = { try { throw new IOException("throw a user define exception!!!") } catch { case e1: IOException => printf("found io exception...&quo

JAVA并发,线程异常捕获

由于线程的特性,当我们启动了线程是没有办法用try catch捕获异常的,如下例: 1 package com.xt.thinks21_2; 2 3 import java.util.concurrent.ExecutorService; 4 import java.util.concurrent.Executors; 5 6 /** 7 * 线程异常捕获测试 8 * 9 * @author xue 10 * 11 */ 12 public class ThreadUncaughtExcepti

Java异常捕获

1 public class Main { 2 3 /** 4 * 在写异常处理的时候,一定要把异常范围小的放在前面,范围大的放在后面, 5 * Exception这个异常的根类一定要刚在最后一个catch里面, 6 * 如果放在前面或者中间,任何异常都会和Exception匹配的,就会报已捕获到异常的错误. 7 * @param args 8 */ 9 public static void main(String[] args) { 10 int a[] = new int[] {1,2,3,

Java解惑四:异常之谜

谜题36 finally语句中的return语句会覆盖掉try语句中的. 谜题37 该部分还需要进一步理解 一个方法可以抛出的被检查异常集合是它所适用的所有类型声明要抛出的被检查集合的交集. Java解惑四:异常之谜,布布扣,bubuko.com

Java解惑三:循环之谜

谜题24 byte是有符号的,范围是-128 - 127.而0x90是int类型.比较的时候,不相等. 如果想让其相等,需要进行类型转换:(byte & 0xff) 或者 (byte)0x99. 谜题25 自增运算符对循环的影响.j = j++,先赋值. 谜题26 Integer.MAX_VALUE加一之后会变成Integer.MIN_VALUE,这对循环会有影响. 可以考虑使用long来表示i变量,或者使用效率更高的i != Integer.MAX_VALUE. 谜题27 (-1 <<

java异常捕获的一点感悟

class Annoyance extends Exception {} class Sneeze extends Annoyance {} class Human { public static void main(String[] args) throws Exception { try { try { throw new Sneeze(); } catch ( Annoyance a ) { System.out.println("Caught Annoyance"); thro

WPF异常捕获三种处理 UI线程, 全局异常,Task异常

原文:WPF异常捕获三种处理 UI线程, 全局异常,Task异常 protected override void OnStartup(StartupEventArgs e){base.OnStartup(e);RegisterEvents();} private void RegisterEvents(){//TaskScheduler.UnobservedTaskException += (sender, args) =>//{// MessageBox.Show(args.Exception