【Java Exception vs Error】细谈java中异常机制

java.lang.Error和java.lang.Exception都是实现了Throwable接口,整个的继承关系如图:
在这里插入图片描述
1.Error
Error是java虚拟机内部的错误,是由于java虚拟机缺少某种系统资源导致的。 这是比较严重的错误,是不能通过编码避免的,也不能使用try-catch-finally代码块来捕获,编译器也不会进行检查。程序出现Error时唯一的办法就是终止程序
例如:StackOverFlowError(栈溢出错误)。是由于程序在运行过程中java虚拟机的虚拟栈机空间溢出导致的。虚拟机栈是程序运行时jvm保存方法中的变量的内存空间,使用栈的数据结构进行存储。当栈中压入过多的变量导致栈空间不够,就会发生这种错误。

2.Exception
与Error不同,Exception是由程序带来的异常,所以在代码中必须添加约束进行避免或者在发生异常时进行处理。当程序中进行了避免或者使用try-catch-finally代码块进行了处理,发生异常时就可以保证程序正常运行,不会终止。Exception按编译器是否进行检查可分为CheckedException(检查型异常)和UnCheckedException(非检查型异常)。

2.1 CheckedException(检查型异常)

检查型异常是指编译器会进行检查的异常,也就是让开发者事先给出发生这种异常时的处理办法。首先这类异常跟代码是否有问题无关,并且不是通过编码就能避免的,但却是在运行时可能发生的,开发者只能通过事后挽救的方式来处理,即通过try-catch-finally代码块进行捕获处理。
例如:FileNotFoundException(文件未找到异常)。这种异常是由于文件不存在导致的,跟程序是否正确没有关系,并且无法避免,只能对这种异常进行捕获,然后给出处理方法(例如将异常写入日志或者给用户一个提示框)。
2.2 UnCheckedException(非检查型异常)
非检查型异常是指编译器不会进行检查的异常。非检查型异常又称为RuntimeException(运行时异常,即运行时才会知道这种异常会发生)。这类异常一般是由于代码有问题导致的,开发者需要在程序中避免发生这种异常,所以一旦发生这类异常就代表这代码有缺陷。另外,由于编译器不会强制要求进行捕获处理,并且程序中也不应该进行捕获处理,所以一旦该类异常发生且没有被捕获,就会导致程序终止。
例如:ArrayIndexOutOfBoundsException(数组越界异常),这是由于程序中访问了不属于数组范围内的元素导致的,这种异常是应该在代码中避免的,如果发生了,那就是代码有Bug。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值