java中exception和error有什么区别

 我来答
尚学堂java学院
2021-01-04 · 百度认证:北京尚学堂科技有限公司官方账号
尚学堂java学院
向TA提问
展开全部

1.如图Exception 和 Error都继承自Throwable类,由jdk api文档中对该类的描述可以知道它是异常处理机制的基本组成类型。可以由虚拟机抛出或者编码者自行抛出(throw)

  • jdk8中文发翻译Throwable类的描述:Throwable类是Java语言中所有错误和异常的Throwable类。 只有作为此类(或其一个子类)的实例的对象由Java虚拟机抛出,或者可以由Java throw语句抛出。 类似地,只有这个类或其子类可以是catch子句中的参数类型。

  • 2.Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类。Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。

    3.Error 是指在正常情况下,不大可能出现的情况,绝大部分的 Error 都会导致程序(比如 JVM 自身)处于非正常的、不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如 OutOfMemoryError 之类,都是 Error 的子类。

    4.Exception 又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。前面我介绍的不可查的 Error,是 Throwable 不是 Exception。

    如何处理这些异常?

  • 在现实编程中我们一般使用 try-with-resources 和 multiple catch来进行一些异常处理(便利的特性),在编译时期,会自动生成相应的处理逻辑,比如,自动按照约定俗成 close 那些扩展了 AutoCloseable 或者 Closeable 的对象。

  • try-with-resources 是一种处理Closeable实现类关闭资源的一种写法,简单写了一个例子可以发现其实这就是一中语法,这种语法可以自动编译帮忙编译最后关闭流的操作:

  • public static void main(String[] args) {

    try (BufferedReader br = new BufferedReader(new FileReader("a"));
    BufferedWriter writer = new BufferedWriter(new FileWriter("a"))) {

    // Try-with-resources
    } catch (IOException e) {// Multiple catch
    // Handle it
    }
    }

    编译后class

    public static void main(String[] args) {        try {
    BufferedReader br = new BufferedReader(new FileReader("a"));
    Throwable var2 = null;            try {
    BufferedWriter writer = new BufferedWriter(new FileWriter("a"));
    Object var4 = null;                if (writer != null) {                    if (var4 != null) {                        try {
    writer.close();
    } catch (Throwable var15) {
    ((Throwable)var4).addSuppressed(var15);
    }
    } else {
    writer.close();
    }
    }
    } catch (Throwable var16) {
    var2 = var16;                throw var16;
    } finally {                if (br != null) {                    if (var2 != null) {                        try {
    br.close();
    } catch (Throwable var14) {
    var2.addSuppressed(var14);
    }
    } else {
    br.close();
    }
    }

    }
    } catch (IOException var18) {
    ;
    }

    }

    异常处理的两个基本原则

  • 尽量不要捕获类似 Exception 这样的通用异常,而是应该捕获特定异常

    这是因为在日常的开发和合作中,我们读代码的机会往往超过写代码,软件工程是门协作的艺术,所以我们有义务让自己的代码能够直观地体现出尽量多的信息,而泛泛的 Exception 之类,恰恰隐藏了我们的目的。另外,我们也要保证程序不会捕获到我们不希望捕获的异常。比如,你可能更希望 RuntimeException 被扩散出来,而不是被捕获。

  • 不要生吞(swallow)异常。这是异常处理中要特别注意的事情,因为很可能会导致非常难以诊断的诡异情况。

    如果我们不把异常抛出来,或者也没有输出到日志(Logger)之类,程序可能在后续代码以不可控的方式结束。没人能够轻易判断究竟是哪里抛出了异常,以及是什么原因产生了异常。

  • 在写程序时可以通过Objects类(jdk提供),或者断言等提前判断问题,如空指针异常的一些值的处理Objects. requireNonNull(filename);而不是使用之后有问题再系统抛出异常,这可能就会不直观的找到问题所在。即:Throw early, catch late 原则

  • 希望对您有所帮助!~

ay...9@163.com
2016-10-29 · 超过39用户采纳过TA的回答
知道答主
回答量:59
采纳率:0%
帮助的人:63万
展开全部
首先从继承方面来说,Error和Exception都是Throwable的子类。所以从根本上你可以理解他们是差不多的,程序出了问题就抛出。然后一般意义来讲,区别就是Error比Exception更严重,不易通过后续代码处理和修复,不应该被代码catch到的错误。而Exception是指严重程度较轻的程序问题,相较于Error更容易被后续代码处理和修复的,有些需要通过try catch代码处理,有些不建议通过try catch代码处理。

知识延伸:
Exception分两种,checked和unchecked。checked Exception就是在写代码的时候,IDE(比如Eclipse)会要求你写try catch的那种Exception,比如IOException。这种Exception是Java的设计者要求你的程序去处理的。这种异常一般不会影响程序的主体,容易手动诊断修复,所以Java要求你在catch下面写出处理的代码,以保证程序遇到此类exception之后还可以正常运行。unchecked这一类就是你在代码处理了checked exception之后,你在运行时候依然会遇到的exception,所以又叫做RunTimeException,比如NullPointerException, IndexOutOfBoundsException。此类exception相较于前面那种更容易影响程序运行,从设计者角度不提倡从程序中catch出来并处理,当然你也可以这么做。

Error就是程序运行时候抛出的最严重级别的错误了,如VirtualMachineError,ThreadDeath。抛出了Error的程序从Java设计的角度来讲,程序基本不可以通过后续代码修复,从而理应终止。当然,从语法上来讲,所有这些都可以被写进catch里面,但是Error因为上述原因,不应该被代码处理。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
甘冷玉祈志
2020-03-28 · TA获得超过3万个赞
知道大有可为答主
回答量:1.1万
采纳率:34%
帮助的人:629万
展开全部
exception翻译成“例外”更合适,因为它是不可预计的,所以在代码中要把可能的exception都抛出。
而错误可能是人为的,你要做的是修改代码,把导致错误的代码改掉。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式