【2021-07-09】说一下 Error 和 Exception 的区别?

未匹配的标注

请移步至::octocat:每日一题 查看更多的题目 ~

答:

【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 可能有如下几点原因:

    1. JVM启动参数内存值设定过小
    2. 代码中存在死循环导致产生过多对象实体
    3. 内存中加载的数据量过于庞大,一次从数据库取出过多的数据也会导致堆溢出
    4. 集合类中有对对象的引用,使用完后未清空,使得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等等

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~