异常 (1)概述:程序出现的不正常的情况。 (2)异常的体系 [size=10.5000pt] 程序的异常 Throwable | | | [size=10.5000pt] 问题Exception | | | | [size=10.5000pt]编译期异常,必须处理的,否则程序编译不通过 |
(3)异常的处理: A:JVM的默认处理 如果程序出现了问题,我们没有做任何处理,这时候JVM就会默认处理 把异常的名称,原因,位置等信息输出在控制台,但是程序不能会继续执行 B:自己处理的两种方式 try...catch...finally | 一旦try里面出现问题,就会将问题抛出去,然后和catch里面的异常类名去匹配,一旦有匹配的,就会执行catch里面的处理,然后结束try...catch,继续执行后面的程序 | catch里面的异常类名,能明确的尽量明确,不要用大的来处理,平级关系的异常谁先谁后无所谓,如果出现了子父关系,父必须在后面,否则全部匹配到父去了 | try里面的代码越少越好,catch里面必须有内容,哪怕是给出一个简单的提示 | JDK7出现的一个新的异常处理方案 try{ ... }catch(异常名1 | 异常名2 | ...){ ... [size=10.5000pt]} | | throws 异常类名 这个格式必须跟在方法的括号后面 | | 把自己处理不了的,在方法上声明,告诉调用者,这里有问题 |
(4)我们到底该如何处理异常呢? 如果该功能内部可以将问题处理,用try,如果处理不了交由调用者处理,用throws 后续程序需要继续执行,用try 后续程序不需要执行,用throws (5)异常Throwable中的几个方法 getMessage() 获取异常信息,返回字符串。 toString() 获取异常类名和异常信息,返回字符串。 printStackTrace() -- 基本用这个 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。 printStackTrace(PrintStream s) 通常用该方法将异常内容保存在日志文件中,以便查阅。 (6)面试题 A:编译期异常和运行期异常的区别? 编译期异常:Java程序必须显示处理,否则程序发生错误,编译不通过 运行期异常:可以不处理,也可以处理 B:throw和throws是的区别 throw: 在方法体中,后面跟的是异常对象名,并且只能是一个 throw抛出的是一个异常对象,说明这里肯定有一个异常产生了 throws: 在方法声明上,后面跟的是异常的类名,可以是多个 throws抛出的是该方法有异常的可能性,这个异常并不一定会产生 C:final,finally,finalize的区别? final:最终的意思,可以修饰类,成员方法,成员变量 修饰类,类不能被继承 修饰变量,变量是常量 修饰方法,方法不能被重写 finally:异常处理的一部分,用于释放资源 一般来说,它的代码永远会执行,除非jvm先退出了 finalize:是Object类的一个方法,用于垃圾回收 D:如果在catch里面有return,请问finally还执行吗?如果执行,在return前还是后 会,前。 实际上在中间。这个上课我们讲过 file:///C:\Users\MAOJUN~1\AppData\Local\Temp\ksohtml\wpsEE0C.tmp.jpg (7)finally关键字及其面试题 finally用于释放资源,它的代码永远会执行。 特殊情况:在执行到finally之前,jvm退出了(System.exit(0)); 异常处理的变形: try...catch...finally try...catch... try...catch...catch... try...catch...catch...fianlly try...finally //是为了释放资源,没有处理异常 (8)自定义异常 继承自Exception或者RuntimeException 只需要提供无参构造和一个带参构造即可 (9)异常的注意事项 A:子类在重写父类的方式时,子类的方法必须抛出相同的异类或父类异常的子类 B:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常 C:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
|