异常是运行时期发生的不正常现象。 以前正常流程代码和问题处理代码相结合,
现在将正常流程代码和问题处理代码分离,提高阅读性。

java通过面向对象的思想将问题封装成了对象.
用异常类对其进行描述。(不同的问题用不同的类进行描述)

异常的抓抛模型

过程一:”抛”:程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象。
并将此对象抛出。
一旦抛出对象以后,其后的代码就不再执行。


关于异常对象的产生:① 系统自动生成的异常对象
② 手动的生成一个异常对象,并抛出(throw)

过程二:”抓”:可以理解为异常的处理方式:① try-catch-finally ② throws



异常体系

描述的类很多,将其共性进行向上抽取,形成了异常体系:
image.png


分成的两大类:
1.一般不可处理的。Error
特点:是由jvm抛出的严重性问题,这种问题一般需要直接修改程序

2.可以处理的。Exception
特点:可以根据程序针对性修改解决


Throwable

Throwable:无论是error,还是异常,问题,问题发生就应该可以被抛出,让调用者知道并处理。该体系的特点就在于Throwable及其所有的子类都具有可抛性。


抛出其实是通过两个关键字来体现的:
1.throws 2.throw

换句话说,凡是可以被这两个关键字所操作的类和对象都具备可抛性

手动抛出异常类

  • throw 表示抛出一个异常类的对象,生成异常对象的过程。声明在方法体内。
  • throws 属于异常处理的一种方式,声明在方法的声明处。

注意:如果让一个类称为异常类,必须要继承异常体系,因为只有称为异常体系的子类才有资格具备可抛性,才可以被两个关键字所操作。

image.png

对于自定义的错误,需要捕获或声明(否则编译失败)

  1. 捕获(catch)
  2. 声明(throws)




为什么有的错误直接可以抛出?
异常与异常捕捉 - 图3

  • RuntimeExcept的任何子类都不需要throws声明。





    异常的分类:

    1,编译时被检测异常:只要是Exception和其子类都是,除了特殊子类RuntioeExcePtion体系。
    这种问题一旦出现,希望在编译时就进行检测,让这种问题有对应的处理方式。 这样的问题都可以针对性的处理。



    2,运行时抛出异常:就是ExcePtion中的RuntimeExtion和其子类(称为运行时异常)。
    这种问题的发生,无法让功能继续,运算无法进行,更多是因为调用者的原因导致的而或者引发了内部状态的改变导致的。
    那么这种问题一般不处理,直接编译通过,在运行时,让调用者调用时的程序强制停止,让调用者对代码进行修正。