一、Throwable的子类
Throwable包含两种子类:Error类与Exception类
-
Error:表示系统级的错误,是java运行环境内部错误或者硬件问题,不能指望程序来处理这样的问题,除了退出运行外别无选择,它是Java虚拟机抛出的。
-
Exception: 表示程序需要捕捉、需要处理的异常,是由与程序设计的不完善而出现的问题,程序必须处理的问题。
从一般意义上讲,Error比Exception更加严重,Exception更容易被后续程序处理和修复。
二、Exception异常
Exception异常分为:checked异常和unchecked异常(可查与不可查异常)
- checked异常:在编译时检查,如果一个方法抛出checked异常,那么它应该使用try-catch块或者使用throws关键字来处理这个异常,否则的话程序会报编译错误。
- unchecked异常:在编译时不会检查,这意味着即使你没有声明或者处理异常你的程序也会抛出一个unchecked异常,程序不会给出一个编译错误。大多数情况下这些异常的发生是由于用户在交互过程中提供的坏数据。这需要程序员提前去判断这种能够产生这种异常的情况并且恰当的处理它。
其实,Java语言规范对这两个定义十分简单,将派生于Error或者RuntimeException的异常称为unchecked异常,所有其他的异常成为checked异常。
三、StackOverflowError与OutOfMemoryError的发生原因
1.StackOverflowError
- 发生的地方:虚拟机栈和本地方法栈
- 原因:线程调用生成的栈桢深度超过了虚拟机允许的深度,也就是递归太深,因为Java线程操作是基于栈的,当调用方法内部方法也就是进行一次递归的时候就会把当前方法压入栈直到方法内部的方法执行完全之后,就会返回上一个方法,也就是出栈操作执行上一个方法。(比如一个方法A内调用了方法B,然后B又调用C...这样调用了1万层,就像你要去地狱十八层,但是虚拟机只提供了到九层的梯子),不过现在大多数虚拟机栈的调动深度都是可以动态扩展的,所以这个问题出现的概率非常的低。
2.OutOfMemoryError
- 发生的地方:基本上虚拟机的运行时数据区域(堆,栈,方法区)都会发生
- 原因:内存不够,发生了内存溢出,JVM不能分配给对象的创建空间.并且GC也不能够回收足够的空间.当你创建对象的速度快于JVM回收空间的时候就会发生空间不足这个问题。
Throwable的两个子类:Error/Exception(面试中异常体系和JavaError问题)_[工仔不是公仔】-CSDN博客