异常的继承和try..catch

一开始看到这样的一段代码:

class ExampleA extends Exception {
}

class ExampleB extends ExampleA {
}

class Test {
	public void main(String[] args) throws Exception{
		try{  
			throw new ExampleB();  
		}catch(ExampleA e){  
			System.out.println("ExampleA");  
		}catch(Exception e){  
			System.out.println("Exception");  
		}  
	}
}

不用想这段代码一定输出的是ExampleA,因为能catch父类异常的地方一定能catch子类异常。

后来又看到这样一段:

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");
                throw a;
            }
        } catch (Sneeze s) {
            System.out.println("Caught Sneeze");
            return;
        } finally {
            System.out.println("Hello World!");
        }
    }
}

我想的是输出:

Caught Annoyance

Hello World!

但是测试结果却是:

Caught Annoyance

Caught Sneeze

Hello World!

当时就很郁闷,明明throw了一个Annoyance a,怎么会被他的子类Sneeze捕获呢,哪有子类捕获父类的道理,想了一会,突然灵光一现,试了一下在throw a之前加了一段代码:

System.out.println(a instanceof Sneeze);
果然输出了true,原来throw的a依然是之前的异常,只是利用多态性父类引用指向了子类对象,并没有另外抛出一个新的父类异常,乍一看还是挺有迷惑性的。



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
try...catch是一种异常处理机制,在代码中可以用来捕获并处理可能发生的异常。它的基本格式是: try { // 可能会产生异常的代码 } catch (ExceptionType exceptionVariable) { // 异常处理代码 } 在try块中放置可能会抛出异常的代码,如果这部分代码发生异常,程序会立即跳转到与异常类型相匹配的catch块中执行异常处理代码。catch块中的代码用于处理异常,并采取相应的措施,比如打印错误信息、修复错误或者进行其他必要的操作。 try...catch的好处是,它可以保证即使有异常发生,程序也不会中断执行,而是会继续执行其他的代码。这对于确保程序的稳定性和可靠性非常重要。 在使用多个catch块处理异常时,需要注意一些规则。首先,多个catch块中的异常类型不能相同,否则会导致编译错误。其次,如果多个catch块中的异常类型存在继承关系,子类异常应该在上面的catch块中处理,父类异常应该在下面的catch块中处理。最后,当发生异常时,多个catch块只会执行一个,按照从上到下的顺序进行匹配。 与try...catch不同,throw是将异常抛给调用它的上一级代码。如果在代码中抛出异常,后续的代码将不会执行。throw通常用于在异常无法直接处理的情况下,将异常传递给调用者或其他地方进行处理。 综上所述,try...catch是一种用于捕获和处理异常的机制,可以保证程序在发生异常时不会中断执行,并提供了灵活的异常处理方式。throw则是将异常抛给上一级代码,以便进行进一步处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值