JAVA基础--异常体系

目录

一、异常概念

二、JAVA异常体系说明

1、Throwable

2、Error

3、Exception

4、RuntimeException

5、其他异常

三、异常处理

1、抛出异常

2、捕获异常

四、异常总结

  1、常见异常

  2、其他异常


一、异常概念

       JAVA的基本理念是“结构不佳的代码不能运行”。

       理想的发现错误的时机是在编译阶段,但是编译器不能发现所有的错误,这时候就需要在在运行期发现这些问题。这就需要错误源能通过某种方式,把适当的信息传递给接受者。

       “异常”,通俗的说就是出现了意外,你可能不知道怎么去处理,你就停下来,把问题报告给上一层。异常是指阻止当前方法或作用域继续执行的情况,在异常出现的场景下,无法获取必要的信息来解决问题,从当前环境跳出,并且把问题提交给上一级环境。

二、JAVA异常体系说明

      JAVA中有许多异常,有编译异常,运行期异常以及错误,但是不管什么异常,他们都继承与Throwable类,异常的架构图如下:

       

1、Throwable

  • Throwable是所有异常及错误的父类;
  • Throwable包含两个子类: Error 和 Exception。它们通常用于指示发生了异常情况。
  • Throwable包含了其线程创建时线程执行堆栈的快照,它提供了printStackTrace()等接口用于获取堆栈跟踪数据等信息。

2、Error

        Throwable的子类,用于捕获系统无法处理的严重问题,大部分Error会导致系统无法正常运行,错误的严重程度在Exception之上。

         编译器不会检查Error。

3、Exception

        与Error一样,是Throwable的子类,主要用于捕获系统可处理的问题。

4、RuntimeException

  • 运行期异常,是虚拟机正常运行期间抛出异常的父类。
  • 编译器不会检查RuntimeException,为非受检异常。
  • RuntimeException可以通过异常捕获,可能会影响部分功能的正常运行,但是不会影响程序整体的运行。

5、其他异常

        除RuntimeException外的异常,继承与Exception,非运行异常。

        编译期就会检查,为受检异常。

        常见异常如下:

                   

三、异常处理

        在java应用中,异常的处理机制分为抛出异常和捕获异常。

1、抛出异常

        当一个方法出现错误而引发异常时,该方法会将该异常类型以及异常出现时的程序状态信息封装为异常对象,并交给本应用。运行时,该应用将寻找处理异常的代码并执行。任何代码都可以通过throw关键词抛出异常,比如java源代码抛出异常、自己编写的代码抛出异常等。方法通过throws关键字抛出异常。

       ①throw抛异常

       throw关键字用在方法内部。一旦出现,后边的代码将不在继续执行,方法可以通过throw将出现的异常抛给方法调用者,也可以通过try-catch进行异常捕获。

       注意只能抛出Throwable类和其子类的对象。

       ②throws抛异常

       用在方法外部,声明可能产生的异常类型,上层调用者需要对异常进行捕获处理,或者继续抛出异常。如果调用者不进行处理,编译器会提示错误。

       throws声明的异常类型可以有多个,调用者要进行响应处理,或处理范围更大的异常。

2、捕获异常

       要明白异常如何被捕获,需要先了解监控区域(guarded region)的概念。它是一段可能产生异常的代码,并且在后边跟着处理这些异常的代码。

       一旦方法抛出异常,系统自动根据该异常对象寻找合适的异常处理器(Exception Handler)来处理该异常。所谓合适类型的异常处理器指的是异常对象类型和异常处理器类型一致。

       ①try-catch

        try {
            //监控区域
            expression;
        } catch (Exception1 e) {
            //异常Exception1捕获处理方法
            handler();
        } catch (Exception2 e) {
            //异常Exception2捕获处理方法
            handler();
        }

       每个catch子句,接收处理一个且只接收一个异常类型。监控区域抛出异常,会由后边紧跟的catch异常处理方法,从上至下顺序判断,直到找到合适的异常处理器,异常处理完成,整个try-catch就执行完毕。

       catch子句的异常范围,从上到下范围有小到大。

       ②try-catch-finally

        try {
            //监控区域
            expression;
        } catch (Exception1 e) {
            //异常Exception1捕获处理方法
            handler();
        } catch (Exception2 e) {
            //异常Exception2捕获处理方法
            handler();
        } finally {
            //无论什么异常一定会执行的区域
            something();
        }
  • try监控区域,在异常发生前的代码会执行,异常发生后的代码将不会执行;
  • catch子句,会根据监控区域抛出的异常,选择一个进行处理;
  • finally区域,执行完异常处理以后,一定会运行该区域代码,常用于流等最后的资源释放;

四、异常总结

  1、常见异常

  • java.lang.NullPointerException:空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等。
  • java.lang.IllegalAccessError:违法访问错误。当一个应用试图访问、修改某个类的域(Field)或者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常。
  • java.lang.InstantiationError:实例化错误。当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常.
  • java.lang.OutOfMemoryError:内存不足错误。当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。
  • java.lang.StackOverflowError:堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出或者陷入死循环时抛出该错误。
  • java.lang.ClassCastException:类造型异常。假设有类A和B(A不是B的父类或子类),O是A的实例,那么当强制将O构造为类B的实例时抛出该异常。该异常经常被称为强制类型转换异常。
  • java.lang.ClassNotFoundException:找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。
  • java.lang.ArithmeticException:算术条件异常。譬如:整数除零等。
  • java.lang.ArrayIndexOutOfBoundsException:数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。
  • java.lang.IndexOutOfBoundsException:索引越界异常。当访问某个序列的索引值小于0或大于等于序列大小时,抛出该异常。
  • java.lang.InstantiationException:实例化异常。当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常。
  • java.lang.NoSuchFieldException:属性不存在异常。当访问某个类的不存在的属性时抛出该异常。
  • java.lang.NoSuchMethodException:方法不存在异常。当访问某个类的不存在的方法时抛出该异常。
  • java.lang.NumberFormatException:数字格式异常。当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常。
  • java.lang.StringIndexOutOfBoundsException:字符串索引越界异常。当使用索引值访问某个字符串中的字符,而该索引值小于0或大于等于序列大小时,抛出该异常。

  2、其他异常

  • java.lang.AbstractMethodError:抽象方法错误。当应用试图调用抽象方法时抛出。
  • java.lang.AssertionError:断言错。用来指示一个断言失败的情况。
  • java.lang.ClassCircularityError:类循环依赖错误。在初始化一个类时,若检测到类之间循环依赖则抛出该异常。
  • java.lang.ClassFormatError:类格式错误。当Java虚拟机试图从一个文件中读取Java类,而检测到该文件的内容不符合类的有效格式时抛出。
  • java.lang.Error:错误。是所有错误的基类,用于标识严重的程序运行问题。这些问题通常描述一些不应被应用程序捕获的反常情况。
  • java.lang.ExceptionInInitializerError:初始化程序错误。当执行一个类的静态初始化程序的过程中,发生了异常时抛出。静态初始化程序是指直接包含于类中的static语句段。
  • java.lang.IncompatibleClassChangeError:不兼容的类变化错误。当正在执行的方法所依赖的类定义发生了不兼容的改变时,抛出该异常。一般在修改了应用中的某些类的声明定义而没有对整个应用重新编译而直接运行的情况下,容易引发该错误。
  • java.lang.InternalError:内部错误。用于指示Java虚拟机发生了内部错误。
  • java.lang.LinkageError:链接错误。该错误及其所有子类指示某个类依赖于另外一些类,在该类编译之后,被依赖的类改变了其类定义而没有重新编译所有的类,进而引发错误的情况。
  • java.lang.NoClassDefFoundError:未找到类定义错误。当Java虚拟机或者类装载器试图实例化某个类,而找不到该类的定义时抛出该错误。
  • java.lang.NoSuchFieldError:域不存在错误。当应用试图访问或者修改某类的某个域,而该类的定义中没有该域的定义时抛出该错误。
  • java.lang.NoSuchMethodError:方法不存在错误。当应用试图调用某类的某个方法,而该类的定义中没有该方法的定义时抛出该错误。
  • java.lang.ThreadDeath:线程结束。当调用Thread类的stop方法时抛出该错误,用于指示线程结束。
  • java.lang.UnknownError:未知错误。用于指示Java虚拟机发生了未知严重错误的情况。
  • java.lang.UnsatisfiedLinkError:未满足的链接错误。当Java虚拟机未找到某个类的声明为native方法的本机语言定义时抛出。
  • java.lang.UnsupportedClassVersionError:不支持的类版本错误。当Java虚拟机试图从读取某个类文件,但是发现该文件的主、次版本号不被当前Java虚拟机支持的时候,抛出该错误。
  • java.lang.VerifyError:验证错误。当验证器检测到某个类文件中存在内部不兼容或者安全问题时抛出该错误。
  • java.lang.VirtualMachineError:虚拟机错误。用于指示虚拟机被破坏或者继续执行操作所需的资源不足的情况。
  • java.lang.ArrayStoreException:数组存储异常。当向数组中存放非数组声明类型对象时抛出。
  • java.lang.CloneNotSupportedException:不支持克隆异常。当没有实现Cloneable接口或者不支持克隆方法时,调用其clone()方法则抛出该异常。
  • java.lang.EnumConstantNotPresentException:枚举常量不存在异常。当应用试图通过名称和枚举类型访问一个枚举对象,但该枚举对象并不包含常量时,抛出该异常。
  • java.lang.Exception:根异常。用以描述应用程序希望捕获的情况。
  • java.lang.IllegalAccessException:违法的访问异常。当应用试图通过反射方式创建某个类的实例、访问该类属性、调用该类方法,而当时又无法访问类的、属性的、方法的或构造方法的定义时抛出该异常。
  • java.lang.IllegalMonitorStateException:违法的监控状态异常。当某个线程试图等待一个自己并不拥有的对象(O)的监控器或者通知其他线程等待该对象(O)的监控器时,抛出该异常。
  • java.lang.IllegalStateException:违法的状态异常。当在Java环境和应用尚未处于某个方法的合法调用状态,而调用了该方法时,抛出该异常。
  • java.lang.IllegalThreadStateException:违法的线程状态异常。当县城尚未处于某个方法的合法调用状态,而调用了该方法时,抛出异常。
  • java.lang.InterruptedException:被中止异常。当某个线程处于长时间的等待、休眠或其他暂停状态,而此时其他的线程通过Thread的interrupt方法终止该线程时抛出该异常。
  • java.lang.NegativeArraySizeException:数组大小为负值异常。当使用负数大小值创建数组时抛出该异常。
  • java.lang.SecurityException:安全异常。由安全管理器抛出,用于指示违反安全情况的异常。
  • java.lang.TypeNotPresentException:类型不存在异常。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值