运行异常
继承里面,父类抛出的异常,子类要想覆盖父类的方法,子类要么不抛出异常(都处理),要么抛出的异常要么和父类的一样,要么就是父类抛出异常类的子类。
机制
(1)发现异常,系统创建异常对象。
new ClassCaseException(parent);
(2)throw ClassCaseException,
在当前方法找处理异常代码(try,catch)。找不到,找声明throws,没有声明就中止程序。发现当前方法声明了不处理此异常。虚拟机到调用该方法的方法找(catch)。Catch{},getMassage()。Catch后面代码会继续执行。
如果在某一个方法中出现异常了,流程是:
首先创建异常对象,抛出,在当前方法中找处理异常的try catch,若没有,则看它是否申明不处理此异常(throws),若申明不处理,再到主方法(调用它的方法)里去找(主方法最好不要写throws),若还找不到则终止程序,若找到了,则主方法用catch捕获。
异常后面的代码都不执行。
try,catch要细化。Try里面的代码才能被catch拦截,没异常的对象不要放在Try里面。
造型异常。处理办法:instanceof
出现异常代码不要和处理异常的代码离得过远。
编译异常
要做try,catch处理,否则编译不通过。给用户做提示。
(1)创建异常对象New FileNotFoundException(c:/a.test)系统找不到指定文件;
(2)throw FileNotFoundException;在当前方法找处理异常的代码catch。
一个try对应多个catch
catch要是正金字塔,从小到大。
不要用一个catch exception处理所有异常。
catch里面要有信息,既然捕获了就要处理。
如果方法里抛出的是运行异常,可以不用throws做声明。
但是不要这么做,都要有声明。
Try,catch,finally
主方法是系统,虚拟机,运行池调用的。
终止程序之前执行finally。不管正常流程还是异常流程,程序中止之前一定要执行finally。
如果finally有返回值,会覆盖正常流程的返回值
被调用的方法没有放在try catch里,找不到。
只有放在try里的代码才能被catch拦截
如果try里有一条代码被catch了,try语句里后面代码不执行
处理异常后,catch后面的其他catch不执行,但是会继续运行程序
抛出异常与拦截异常的类型一致
Catch一定要细化异常,有具体的对应的异常类
如果最大的exception放在最上面,后面代码不执行,编译不通过
Throws、Throw
共同点:都是处理异常,都与异常有关
不同点:
1.throws在方法声明后面。Throw在方法体里
2.throws后面跟一个或多个异常类。Throw后面跟一个异常对象。
3.throws说明该方法不处理该种类型的异常。Throw异常扔出去,给调用方法处理。
(Throws:在方法申明的后面, Throws可以申明一个或多个异常类,本方法不处理throws所标明的这个异常类所对应的异常,抛给调用它的方法。)
(Throw:在方法内部,只能跟一个异常对象,表明在方法内部抛出了一个异常。
系统创建,显式手工创建。在方法内部,不管是显式还是隐式的,throw一定会跟一个异常对象。)
联系:
有异常尽量在本地方法处理,处理不了再抛给调用方法处理。
Finally:可以运行清理类型等收尾善后性质的语句,关闭资源。
不管正常流程还是异常流程,返回调用方法的以前,都要执行finally。
Finally有返回值就把异常隐藏了。
Finally不要写返回值:
(1)会覆盖正常代码的返回值。
(2)会覆盖异常代码的返回值。
(3)会隐藏异常。
Finally不要用return,它会覆盖正常流程的返回值,也会覆盖异常流程的返回值,会隐藏异常(虽然处理了,但是隐藏了)。
有try不一定有catch,但要有finally。
方法抛出编译异常,在方法里处理运行异常。
异常类
私有属性:private String massage,调用有参的构造方法。
构造方法:无参的和有参的。
公有方法:getMassage()。
复写了toString():输出异常类的地址->异常类的类型:massage(值)。
两个获得massage方法:getMassage(),异常栈跟踪(哪个类,哪个方法,哪个行)。
自定义异常
(1)必须继承异常类结构里面的一个类。
(2)一个无参的构造方法。
(3)显示地写一个有参的构造方法,里面写super(),设massage。
(4)自定义toString()。
创建异常类:
异常栈跟踪e.printStackTrace(),先调用异常对象的toString(),指明产生异常对象的位置。
若处理异常、发生异常很远,third-second-first-main,影响虚拟机执行时间,大大增加了处理异常的时间和成本。