java语言核心---异常的处理
Throwable类有两个子类
1).Error 类 : 不可抗力的因素,例如:内存溢出...
2).Exception类:
编译异常:编译时期出现的异常 例如, 解析异常ParseException
运行异常:编译可以通过,运行时期出现的异常 例如, 空指针异常NullpointerException throw
Throwable类是Exception类的父类,子类可以调用Throwable类的方法
Exception为所有异常类的父类,使用多态,可以代表所有异常 //多层继承
如何获取异常信息 用Throwable类的方法
1) String getMessage():获得异常描述的信息
2) String toString():获得异常的类型和异常描述的信息(一般不用)
3) void printStackTace():无返回值, 打印跟踪栈信息并输出控制台,不需要使用system.out.println 该跟踪栈信息中包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段都是使用printstackTrace
//现在在catch语句块里,必须写 e.printStackTrace() 目的:查看异常的具体信息,方便调试和修改
解决异常的方式有两种:
1).利用try...catch语句处理异常
2).利用throws 抛出异常
捕获一个异常:
格式: try{
}catch(异常类名称 变量 ){
变量.printStackTace();
} finally{
}
捕获多个异常:
格式: try{
}catch(异常类名称 变量 ){
变量.printStackTace();
} catch(异常类名称 变量 ){
变量.printStackTace();
}finally{
}.......
//多个异常也可以用一个catch语句表示:
try ......catch(异常类1 |异常类2........ )
//finally 里面的代码一定会执行,除非在finally语句之前使用 System.exit(statue) 即停止JVM
注意:
1). 捕获多个异常时,异常的范围必须是从小到大,不能从大到小
2). 自定义的异常必须继承于Exception类
IO流中的异常处理,在关闭流对象之前一般会进行非空判断,非空的话进行资源关闭,资源关闭语句一般在finally语句中
实例如图:
掌握异常的三个方面:
1.五个关键字:try catch finally throw throws
2.异常体系的两个继承结构
1).Throwable类有两个子类(Error和Exception)
2).Exception类有两个子类RuntimeException,checkException
3).RuntimeException类及其子类称之为:Runtime异常,可以不做处理,默认jvm底层处理
4).Exception类和子类(除了RuntimeException体系)称之为:check异常,必须抛出异常或者利用try catch语句处理
3.定义异常类
//异常出现之后程序会中断,不在向下执行,需要处理异常才能向下执行
//try finally和catch不能单独使用
面试题:
1.Error和Exception的区别和关系
答:Error:表示错误,一般指JVM相关的不可修复的错误,如系统崩溃,内存溢出,JVM错误等,由JVM抛出,我们不需要做任何处理
Exception:表示异常,指程序中出现不正常的情况,该问题可以修复 (异常指的是运行异常,而不是编译异常)
2.check异常和runtime异常的区别
Runtime异常:可以不做处理,利用throws抛出,最终默认jvm底层处理
check异常:必须抛出异常或者利用try catch语句处理
3.如何保证一段代码必须执行到(finally)
4.finally语句一定会执行吗?
答:不一定 当try或catch语句调用退出jvm的方法时,则不会执行finally语句
System.exit(0) 该语句就是退出jvm的方法
5.finally和return执行顺序?
答:当try或catch语句有return语句,则永远返回的都是finally里面的结果,利用debug工具可以查看底层是如何运行的
eg: private static int test2(){
try{
return
0;
}finally{
return
100;
} //返回的结果为100
private static int test3(){
int a=1;
try{
return
a;
}finally{
++
a;
} //返回结果为 1,其实该结果在最初就确定了
6.throw和throws的区别?
答:throw:一般的,当一个方法出现不正常的情况时,我们不知道返回什么值,此时就返回一个错误对象,在catch语句中继续向上抛出异常,并结束语句
格式 :throw new 异常类("异常的信息,比如by zero")
throws:运用于方法声明之上,用于表达当前方法不处理异常,而是提醒调用者来处理异常(抛出异常)
7.列举五个常见的异常类?
8.列举五个常见的Runtime异常类?
答: Runtime异常类:
ArithmeticException: 算数异常
NuPointerException: 空指针/引用异常
ArrayindexException: 数组索引越界异常
StringindexException:字符串索引越界异常
NumberFormatException:数字格式化异常
ClassCastException: 类型强制转换异常
9.final,fanally,fanalize的区别?
final可以修饰类,该类不能被继承;可以修饰变量,该变量是常量,可以修饰成员方法,该方法不能被重写
finalize:gc():运行垃圾回收器,实际是调用finalize方法,和垃圾回收器有关系
finally: 在io,数据库中以及后面对数据库操作(DBUtuls/c3p0/Hibernate/MyBatis)里面中释放资源的