JAVASE-12 异常机制

1.基类Throwable

Error和Exception都继承与Throwable
extends Throwable的类都可以进行抛出和捕获(针对自定义而言,如OutOfMemoryError等无法捕获)。Error是程序无法处理的错误,只能重启jvm来解决,如OutOfMemoryError或StackOverflowError。 Exception是程序可以处理的异常,分为checkException和RuntimeException;
异常如果没有捕获,会一直往上传递,直达调用链顶部,并抛出异常,该线程被终止。异常机制指定了程序遇到错误后,程序应该如何处理。具体来说,异常机制也提供了程序安全退出的通道:当一个线程遇到异常后,如果异常被捕获,会进入捕获的逻辑进行处理。

扩展:
线程池的线程是可以被重复利用的,如果其中一个线程出现异常,这个线程会被线程池处理掉,线程池会创建一个新的线程替换原来的线程。

2.异常的执行顺序:

对于有返回值的方法,必须保证每条执行路径都有返回值或者抛出异常;
(1) 执行顺序
先执行try块中的代码,如果没有异常,执行完try后,再执行finnally块;
如果遇到异常,中断try块,执行catch块,再执行finnally块,接着继续往下执行代码逻辑.
(2) return语句的影响
finally语句优先于try块中的return语句(这是不建议在finally中使用return语句的原因);正常情况下,try块执行到return语句时,保存返回值A,再执行finally块,然后返回值A。此时,会有3中情况:
case1:如果finnally块中有return语句,直接执行finally块中的return B语句,返回;try块中的return A被舍弃。

//Fimxme:伪代码
try {
	int A = 1// 执行逻辑
	return A;
} finally {
	return B;
}

case2:finally块中没有return语句,但是修改了返回值,返回值类型时基本类型或String等不变类型,不影响返回值;

//Fimxme:伪代码
try {
	String A = 1;
	// 执行逻辑
	return A;
} finally {
	A = 2;
}

返回的值是1;

case3:finally块中没有return语句,但是修改了返回值,返回值类型是引用类型,影响返回值。

//Fimxme:伪代码
try {
	Car A = new Car("benci");
	// 执行逻辑
	return A;
} finally {
	A = new Car("bmw");
}

最后得到的结果是bmw.

3.可见性

try块,catch块,finally块是不同的代码块,相互之间不可见对方声明的变量。有一条很容易忽视:try-with-resource中在try()中声明的变量仅在try块中可见,在catch和finally块中访问会报错。
扩展一下:

try-with-resource中在try()中声明的资源会在代码执行完成后,自动关闭,且按照声明的顺序,逆向关闭。

4.catch捕获异常的顺序:

catch捕获异常时,按照从上往下的顺序匹配,因此子类异常需要放在父类的上面,否则将形同虚设。

5.重写方法时,抛出异常的范围

对于checkException ,编译器会检查异常抛出范围,要求子类不能超出父类抛出异常的范围:

父类方法没有异常,子类不可以抛出异常;
父类方法抛出异常E1,子类中可以抛出不超过E1的异常或者不抛出异常;
(不超出父类范围是指:子类方法中可以抛出E1或者E1的子类)
对于runtime Exception,不受上述规则限制。

6.常见check Exception

java提供了很多checkException,下面列举了一些常见的checkException,从名字比较直观得看出代表的异常类型。

InterruptedException
CloneNotSupportException
InstantianException
CertificateException
ClassNotFoundException
IllegalAccessException
NoSuchException
SQLException
ParseException
FileNotFoundException
EOFException

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值