一、概述
异常是对问题的描述。将问题进行对象的封装
|--异常的作用是: 1.将问题进行封装; 2.将正常流程代码和问题处理代码相分离,方便于阅读。 |--异常的体系
|--Throwable
|--Error ------>不可以 处理的错误,如JAVA 虚拟机出现错误
|--Exception ------->可处理的异常
|--RuntimeException
RuntimeException类是Exception类的子类,它叫做运行时异常,Java中的所有运行时异常都会直接或者间接地继承自RuntimeException类 |--非RuntimeException Java中凡是继承自Exception,而不继承自RuntimeException类的异常都是非运行时异常。
二、异常的处理
如果函数内部声明了异常,就必须进行处理(RuntimeException除外)。异常有两种处理方式,throws和try/catch
|--异常的处理原则
1.处理方式有两种:try和 throws2.调用到抛出异常的功能时,抛出几个,就处理几个。一个try对应多个catch 3.多个catch,父类的catch放到最 下面; 4.catch内,需要定义针对性的处理方式。不要简单的定义printStackTrace,也不 要不写。当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。
5.catch内,处理不了时,可以将异常转换后,在抛出和该功能相关的异常,或抛出相关的新的异常。try{ throw new AException(); }catch(AException e){ throw e; }
try{ throw new AException(); }catch(AException e){ throw new BException(); }
|--异常的处理
|--try/catch
try{ 需要被检测的代码; } catch(异常类 变量){ 处理异常的代码;(处理方式) }finally{ 一定会执行的语句; }
注:|--1.可以使用多个catch块来捕获异常,这时需要将父类型的catch块放到子类型的catch块之后,这样才能保证后续的catch块可能被执行,否则子类型的catch块将永远无法到达,Java编译器会报错。 |--2.finally 可以省略不写
|--throws 在函数上进行异常声明,让调用者进行处理如果不进行这两种方式处理编译是不会通过的。(除了Exception中的特殊一个子类RuntimeException)
三、throw和throws
异常体系的所有类以及建立的对象都具备可抛性。也就是说可以被throw和throws关键字所操作。只有异常体系具备这个特点。
|--throw throw定义在函数内,用于抛出异常对象。|--throws throws定义在函数上,用于抛出异常类,可以抛出多个异常,用逗号相隔。
四、RuntimeException
Exception中有一个特殊的子类异常RuntimeException运行时异常。对于运行时异常(RutimeException),可以对其进行处理,也可以不处理。推荐不对运行时异常进行处理。
|--特点1.如果在函数内容抛出该异常,函数上可以不用声明,编译可以通过; 2.如果在函数上声明了该异常,调用者可以不用进行处理。编译一样通过
五、自定义异常
自定义异常类继承了Exception或者RuntimeException,当要定义自定义异常的信息时,可以使用父类已经定义好的功能,异常信息传递给父类的构造函数。
|--自定义异常的作用是:1.为了让该自定义类具备可抛性。 2.让该类具备操作异常的共性方法。
|--在子父类覆盖时:
1.子类抛出的异常必须是父类的异常的子类或都子集;
2.如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try,不能抛;