Throwable、Error、Exception、RuntimeException 区别 联系

转载 https://blog.csdn.net/liuj2511981/article/details/8524418

概要

1.Throwable 类是 Java 语言中所有错误或异常的超类。它的两个子类是Error和Exception;

2.Error 是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获的严重问题。大多数这样的错误都是异常条件。虽然 ThreadDeath 错误是一个“正规”的条件,但它也是 Error 的子类,因为大多数应用程序都不应该试图捕获它。在执行该方法期间,无需在其 throws 子句中声明可能抛出但是未能捕获的 Error 的任何子类,因为这些错误可能是再也不会发生的异常条件。

3.Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。

4.RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。可能在执行方法期间抛出但未被捕获的RuntimeException 的任何子类都无需在 throws 子句中进行声明。它是Exception的子类。

5.方法重写时:在子类中一个重写的方法可能只抛出父类中声明过的异常或者异常的子类

Error与Exception有什么区别?

Error类和Exception类都继承自Throwable类。

  • Error的继承关系:

java.lang.Object 
 java.lang.Throwable
      java.lang.Error

  • Exception的继承关系:

java.lang.Object
java.lang.Throwable
     java.lang.Exception

二者的不同之处:

Exception:

1.可以是可被控制(checked) 或不可控制的(unchecked)

2.表示一个由程序员导致的错误

3.应该在应用程序级被处理

Error:

1.总是不可控制的(unchecked)

2.经常用来用于表示系统错误或低层资源的错误

3.如何可能的话,应该在系统级被捕捉

Java 中定义了两类异常

  1) Checked exception: 这类异常都是Exception的子类 。异常的向上抛出机制进行处理,假如子类可能产生A异常,那么在父类中也必须throws A异常。可能导致的问题:代码效率低,耦合度过高。
  
  2) Unchecked exception: 这类异常都是RuntimeException的子类,虽然RuntimeException同样也是Exception的子类,但是它们是非凡的,它们不能通过client code来试图解决,所以称为Unchecked exception 。

Java 中异常类的继承关系图:



 

Checked Exception与Runtime Exception 的区别

Java里有个很重要的特色是Exception ,也就是说允许程序产生例外状况。而在学Java 的时候,我们也只知道Exception 的写法,却未必真能了解不同种类的Exception 的区别。

  首先,您应该知道的是Java 提供了两种Exception 的模式,一种是执行的时候所产生的Exception (Runtime Exception),另外一种则是受控制的Exception (Checked Exception)。

  所有的Checked Exception 均从java.lang.Exception 继承而来,而Runtime Exception 则继承java.lang.RuntimeException 或java.lang.Error (实际上java.lang.RuntimeException 的上一层也是java.lang.Exception)。

  当我们撰写程序的时候,我们很可能会对选择某种形式的Exception 感到困扰,到底我应该选择Runtime Exception 还是Checked Exception ?

  其实,在运作上,我们可以通过Class 的Method 如何产生某个Exception以及某个程序如何处理这个被产生来的Exception 来了解它们之间的差异。
首先我们先建立一个Exception

[java] view plain copy

print?

  1. public class CException extends Exception {
  2. public CException() {
  3. }
  4. public CException(String message) {
  5. super(message);
  6. }
  7. }
public class CException extends Exception {    public CException() {    }    public CException(String message) {        super(message);    }}

然后我们撰写一个可能产生 CException 的 Class

[java] view plain copy

print?

  1. public class TestException {
  2. public void method1() throws CException {
  3. throw new CException("Test Exception");
  4. }
  5. public void method2(String msg) {
  6. if (msg == null) {
  7. throw new NullPointerException("Message is null");
  8. }
  9. }
  10. public void method3() throws CException {
  11. method1();
  12. }
  13. // 以下省略
  14. // ...
  15. }
public class TestException {    public void method1() throws CException {        throw new CException("Test Exception");    }    public void method2(String msg) {        if (msg == null) {            throw new NullPointerException("Message is null");        }    }    public void method3() throws CException {        method1();    }    // 以下省略    // ...}

 在这三个method 中,我们看到了method1 和method2 的程序码内都会产生Exception,但method3 的程序码中(大括号内),并没产生Exception,但在method3 的定义中,暗示了这个method 可能产生CException。

  呼叫method1() 的程序,必须将method1() 包含在try 与catch 中,如:

[java] view plain copy

print?

  1. public class Runtest {
  2. // ....
  3. public static void main(String argv[]) {
  4. TestException te = new TestException();
  5. try {
  6. te.method1();
  7. } catch (CException ce) {
  8. // ....
  9. ce.printStackTrace();
  10. }
  11. }
  12. // ...
  13. }
public class Runtest {    // ....    public static void main(String argv[]) {        TestException te = new TestException();        try {            te.method1();        } catch (CException ce) {            // ....            ce.printStackTrace();        }    }    // ...}

虽然包含在try 与catch 中,并不表示这段程序码一定会收到CException,但它的用意在于提醒呼叫者,执行这个method 可能产生的意外,而使用者也必须要能针对这个意外做出相对应的处理方式。

  当使用者呼叫method2() 时,并不需要使用try 和catch 将程序码包起来,因为method2 的定义中,并没有throws 任何的Exception ,如:

[java] view plain copy

print?

  1. public class Runtest
  2. {
  3. // ....
  4. public static void main(String argv[])
  5. {
  6. testException te = new testException();
  7. // 不会产生 Exception
  8. te.method2("Hello");
  9. // 会产生 Exception
  10. te.method2(null);
  11. }
  12. // ...
  13. }
public class Runtest{// ....public static void main(String argv[]){testException te = new testException();// 不会产生 Exceptionte.method2("Hello");// 会产生 Exceptionte.method2(null);}// ...}

程序在执行的时候,也不见得会真的产生NullPointerException ,这种Exception 叫做runtime exception 也有人称为unchecked exception ,产生Runtime Exception 的method (在这个范例中是method2) 并不需要在宣告method 的时候定义它将会产生哪一种Exception 。

  在testException 的method3() 中,我们看到了另外一种状况,也就是method3里呼叫了method1() ,但却没有将method1 包在try 和catch 之间。相反,在method3() 的定义中,它定义了CException,实际上就是如果method3 收到了CException ,它将不处理这个CException ,而将它往外丢。当然,由于method3 的定义中有throws CException ,因此呼叫method3 的程序码也需要有try catch 才行。

  因此从程序的运作机制上看,Runtime Exception与Checked Exception 不一样,然而从逻辑上看,Runtime Exception 与Checked Exception 在使用的目的上也不一样。

  一般而言,Checked Exception 表示这个Exception 必须要被处理,也就是说程序设计者应该已经知道可能会收到某个Exception(因为要try catch住) ,所以程序设计者应该能针对这些不同的Checked Exception 做出不同的处理。

  而Runtime Exception 通常会暗示着程序上的错误,这种错误会导致程序设计者无法处理,而造成程序无法继续执行下去。

看看下面的例子:

String message[] = {"message1", "message2","message3"};
System.out.println(message[3]);

  这段程序码在Compile 时并没问题,但在执行时则会出现ArrayIndexOutOfBoundException 的例外,在这种状况下,我们亦无法针对这个Runtime Exception 做出有意义的动作,这就像是我们呼叫了testException 中的method2 ,却引发了它的NullPointerException 一样,在这种状况下,我们必须对程序码进行修改,从而避免这个问题。

  因此,实际上我们应该也必须要去抓取所有的Checked Exception,同时最好能在这些Checked Exception 发生的时候做出相对应的处理,好让程序能面对不同的状况。

  然而对于Runtime Exception ,有些人建议将它catch 住,然后导向其它地方,让程序继续执行下去,这种作法并非不好,但它会让我们在某些测试工具下认为我们的程序码没有问题,因为我们将Runtime Exception "处理"掉了,事实却不然!譬如很多人的习惯是在程序的进入点后用个大大的try catch 包起来,如:

[html] view plain copy

print?

  1. public class Runtest1 {
  2. public static void main(String argv[]) {
  3. try {
  4. // ...
  5. } catch (Exception e) {
  6. }
  7. }
  8. }
public class Runtest1 {    public static void main(String argv[]) {        try {            // ...        } catch (Exception e) {        }    }}

在这种情况下,我们很可能会不知道发生了什么Exception 或是从哪一行发出的,因此在面对不同的Checked Exception时,我们可已分别去try catch它。而在测试阶段时,如果碰到Runtime Exception ,我们可以让它就这样发生,接着再去修改我们的程序码,让它避免Runtime Exception,否则,我们就应该仔细追究每一个Exception ,直到我们可以确定它不会有Runtime Exception 为止!

  对于Checked Exception 与Runtime Exception ,我想应该有不少人会有不同的观点,无论如何,程序先要能执行,这些Exception 才有机会产生。因此,我们可以把这些Exception 当成是Bug ,也可以当成是不同的状况(Checked Exception),或当成是帮助我们除错的工具(Runtime Exception),但前提是我们需要处理这些Exception ,如果不处理,那么问题或状况就会永远留在那里。

原文地址:https://www.cnblogs.com/zhihaowu/p/8877225.html

时间: 2024-10-06 00:22:54

Throwable、Error、Exception、RuntimeException 区别 联系的相关文章

Throwable和Exception的区别

Java语言要求java程序中(无论是谁写的代码)所有抛出(throw)的异常都必须是从Throwable派生而来.当然,实际的Java编程中,由于JDK平台已经为我们设计好了非常丰富和完整的异常对象分类模型.因此,java程序员一般是不需要再重新定义自己的异常对象.而且即便是需要扩展自定义的异常对象,也往往会从Exception派生而来.所以,对于java程序员而言,它一般只需要在它的顶级函数中catch(Exception ex)就可以捕获出所有的异常对象. 所有异常对象的根基类是 Thro

Java-异常Throwable,Exception,Error

  异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等. 异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程. Java通过API中Throwable类的众多子类描述各种不同的异常.因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件.当条件生成时,错误将引发异常. 在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出).Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共

Exception 和 Error 有什么区别么

声明 本篇所涉及的提问,正文的知识点,全都来自于杨晓峰的<Java核心技术36讲>,当然,我并不会全文照搬过来,毕竟这是付费的课程,应该会涉及到侵权之类的问题. 所以,本篇正文中的知识点,是我从课程中将知识点消耗后,用个人的理解.观念所表达出来的文字,参考了原文,但由于是个人理解,因此不保证观点完全正确,也不代表错误的观点是课程所表达的.如果这样仍旧还是侵权了,请告知,会将发表的文章删掉. 当然,如果你对此课程有兴趣,建议你自己也购买一下,新用户立减 30,微信扫码订阅时还可以返现 6 元,相

java中error和exception的区别

转载 :https://blog.csdn.net/lifengguo_njupt/article/details/7990485 java中error和exception的区别 Error类和Exception类的父类都是throwable类,他们的区别是: Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等.对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止. Exception类表示程序可以处理的异常,可

Exception和Error有什么区别?

典型的回答是这样的: Exception 和 Error都继承了Throwable类,在java中只有Throwable类型的实例才可以被抛出(Throw)或者捕捉(catch),它是异常处理机制的基本组成类型. Exception是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应的处理.     Error指在正常情况下,不大可能出现的情况,绝大部门的Error都会导致程序处于非正常的,不可恢复状态.既然是非正常情况,所以不便于也不需要捕获.比如常见的OutOfMemoryEr

Throwable和Exception

所有异常对象的根基类是 Throwable ,Throwable从Object直接继承而来(这是java系统所强制要求的),并且它实现了 Serializable接口(这为所有的异常对象都能够轻松跨越Java组件系统做好了最充分的物质准备).两个子类,Error与Exception.Exception是java程序员所最熟悉的,它一般代表了真正实际意义上的异常对象的根基类.也即是说, Exception 和从它派生而来的所有异常都是应用程序能够catch到的,并且可以进行异常错误恢复处理的异常类

log.error(&quot;异常:&quot;, e);与log.error(e.getMessage());区别

转: log.error("异常:", e);与log.error(e.getMessage());区别 2017年04月28日 14:51:32 行走的soong 阅读数:12017 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Soongp/article/details/70911198 昨天接到消息,要去海尔商城做一个CM系统,但是海尔那边还需做一下简单的面试,把把关.废话不多说,讨论问题: 不知道大家在正常的开发中,有没有细

检查型异常(Checked Exception)和非检查型异常(Unchecked Exception)的区别

最近温故spring事务相关知识点,我们知道Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚 (至于为什么spring要这么设计:因为spring认为Checked的异常属于业务的,程序猿需要给出解决方案而不应该直接扔该框架) 这里就引出一个小的知识点,什么是Checked Exception?什么是Unchecked Exception? 其实,Java语言规范对这两个定义十分简单,将派生于Error或者RuntimeExce

软件测试作业2 — 软件测试中的错误Failure, Error, Fault的区别

软件测试中的错误Failure, Error, Fault的区别: Failure: External, incorrect behavior with respect to the requirements or other description of the expected behavior(预期行为出错或与其他的外部行为描述不符).指软件在运行时出现的功能的丧失,类似于看病时病人发病的症状. Fault: A static defect in the software(软件中的静态缺陷