【2021-07-09】说一下 Error 和 Exception 的区别?
请移步至:
每日一题 查看更多的题目 ~
答:
首先,Error类和Exception类都继承自Throwable类。
Error
Error表示系统级的错误,一般是指与虚拟机相关的问题,由虚拟机生成并抛出,常见的虚拟机错误有:OutOfMemoryError,StackOverflowError 等等。
这两种错误是要求大家务必掌握的。
StackOverflowError,即栈溢出错误,一般无限制地递归调用会导致 StackOverflowError 的发生,所以,再一次提醒大家,在写递归函数的时候一定要写 base case,否则就会导致栈溢出错误的发生。
如示例程序:
public class StackOverflowErrorTest { public static void foo(){ System.out.println("StackOverflowError"); foo(); } public static void main(String[] args) { foo(); } }
该程序会导致抛出 StackOverflowError
OutOfMemoryError,即堆内存溢出错误,导致 OutOfMemoryError 可能有如下几点原因:
- JVM启动参数内存值设定过小
- 代码中存在死循环导致产生过多对象实体
- 内存中加载的数据量过于庞大,一次从数据库取出过多的数据也会导致堆溢出
- 集合类中有对对象的引用,使用完后未清空,使得JVM无法回收
示例程序:
public class OutOfMemoryErrorTest { public static void main(String[] args) { while (true){ new Thread(() -> { try { Thread.sleep(1000); } catch (InterruptedException e) { } }).start(); } } }
本示例代码为一个死循环,不断创建新的线程,该代码运行会抛出 OutOfMemoryError。
Exception
Exception表示异常,通俗地讲,它表示如果程序运行正常,则不会发生的情况。
Exception可以划分为
- 运行时异常(RuntimeException)
- 非运行时异常
或者也可以划分为:
- 受检查异常(CheckedException)
- 不受检查异常(UncheckedException)
实际上,运行时异常就是不受检查异常。
什么是运行时异常(RuntimeException),或者说什么是不受检查异常(UncheckedException)呢?
通俗地讲,不受检查异常是指程序员没有细心检查代码,造成例如:空指针,数组越界等情况导致的异常。这些异常通常在编码过程中是能够避免的。并且,我可以在代码中直接抛出一个运行时异常,程序编译不会出错:
public class Test { public static void main(String[] args) { throw new IllegalArgumentException("wrong"); } }
什么是受检查异常呢?
受检查异常是指在编译时被强制检查的异常。受检查异常要么使用
try-catch
语句进行捕获,要么使用throws
向上抛出,否则是无法通过编译的。常见的受检查异常有:FileNotFoundException,SQLException等等