-
throwable:异常根基类
-
Ecception:异常类,本可以处理的异常
-
RuntimeException
-
运行时异常
- 处理方式1:使用tyr{}catch()进行捕获
- 处理方式2:用throws关键字声明抛出异常类,调用者进行处理
- 也可不进行处理,编译期不报错,但是运行期间可能报错,会导致程序终止,
-
其他子类
-
编译时异常
- 处理方式1:使用tyr{}catch()进行捕获
- 处理方式2:用throws关键字声明抛出异常类,调用者进行处理
-
Error:错误类
- 程序无法处理的类
-
常用异常
-
SQLException:操作数据库异常类
- 现在java程序大多异来数据库,当程序与数据库沟通时发生错误,变会引发这个异常。
- 例如向数据库插入一组数据,数据库设定某个字段的唯一性,而插入的数据去导致了这个字段的重复,违反了数据库的唯一性,此时数据库变会抛出一个异常信息,操作数据库类捕捉到这个异常信息,根据这个信息分析出现异常的原因
-
ClassCastException:数据类型转换异常
- java程序中,有时需要对数据类型进行转换,但是要基于一个原则,数据的兼容性。违反了这个原则,便会触发数据转换异常类
- 例如:在应用程序中,我们需要将一个字符型的日期转换为数据库所能接受的日期型的数据,只需要在前台应用是程序中控制即可。但是如果前台程序却反这个转换功能能,如果用户在输入日期的时候,只输入了月,日,而忘记输入看年份,此时应用程序在进行数据转换的时候便会报出异常
- 处理方法:在前台控制程序中添加相应的转换方法,例如使用将字符日期转换为Date类型的 SimpleDateFormat类,或者在只允许数值类型的字段中,设置不允许用户输入出数值以外的字符
-
NumberFormatException:字符串转换为数字类型时抛出的异常
- 字符型转换为数字出现的问题,将“123456”转换为数字是允许的。但是如果字符串中出现非数字的字符是,程序便会报错
-
java.lang.NullPointerException:空指针异常
- 调用了未初始化的对象或者不存在的对象
- 例如:查询数据库时,数据库返回是一个list,但是我们并没有对这个list进行判断,其list是否为null,或者其size是否为零,如若list为空,我们调用其元素,便会报空指针异常
-
java.lang.ClassNotFoundException
- 制定的类不存在
- 如果程序中出现此类异常,可能是缺少某些第三方开源jar包
- 根据异常信息,找到缺少的相应的jar包,并将导入到程序中
-
java.lang.ArithmeticException:数字运算的异常
- 如除数为零等
-
java.lang.ArithmeticException:数组下标越界
- 对数组进行操作时,如果显式的,用常数当做下标。不易出错,但是隐式,即用变量当做下标便容易出错了,或者程序定义数组长度是用某种特定方法决定的,这个时候,事先调用数组的length属性,查看数组的长度
-
java.lang.IllegalArgumentException:方法的参数错误
- g.setColor(int red,int green,int blue)这个方法中的三个值,如果有超过255的也会出现这个异常
-
java.lang.IllegalAccessException:没有访问权限
- 程序调用一个类,当前方法没有对该类的访问权限
- 如果一个类的修饰符为private,调用该类,便会错误
-
InterruptedException
- 线程调用sleep()方法时会抛出此异常,
-
自定义异常
- 继承Exception类
- 使用super关键字调用父类的构造方法即可
- 使用自定义异常,只需在方法内部应throw关键字声明抛出异常实例即可
- 使用自定义异常需将其try{}catch或者将其声明抛出。调用者处理
-
五个关键字
-
try
- 编写可能发生异常的java语句
-
catch
-
指明接收的异常类,的编写针对异常处理的代码,可以有多个catch语句
- 可以将异常信息打印出来
- 也可用logger框架将logger日志打印出来,日志级别为error
- 异常类需从小到大,异常父类需在其子类之后捕捉
- 执行一些具体功能,例如跳转错误页面等
-
finally
-
所包含的代码必须被执行,但是当tyr.catch语句中执行了System.ecxt(0)的情况下,finally语句不会被执行
- finally代码块主要用来释放资源,比如:I/O缓冲区,数据库连接
-
throw
- 在方法内部抛出一个异常实例,可以是自己定义的,也可以是自己定义的,可以try{}catch,也可以抛出
-
throws
- 在方法后声明此方法可能发生的异常,可以throws多个类型异常,可以是系统定义的。也可以是自己定义的,用逗号隔开,调用者处理
-
常用方法
- getMssage():返回异常消息字符串
- printStackTrace():将异常类及其追踪输出至标准错误流
- printStackTrace(PrintStream):将异常类及其追踪输出到指定输出流
-
有return情况下的try..catch..fianlly执行顺序情况
-
举例
-
A:try{} catch(){}finally{} return
- 按顺序执行
-
B:try{ return; }catch(){} finally{} return;
- 程序执行try块return之前(包含return语句中的表达式运算)代码,
- 再执行finally代码块,最后执行try块中return语句
- finally块之后的语句return,因为程序在try中已经return所以不再执行
-
C:try{ } catch(){return;} finally{} return;
- 程序先执行try,如果遇到异常执行catch块
-
有异常
- 则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码
- 最后执行catch块中return. finally之后也就是4处的代码不再执行
- 无异常:执行完try再finally再return
-
D:try{ return; }catch(){} finally{return;}
- 程序执行try块return之前(包含return语句中的表达式运算)代码,
- 再执行finally块,因为finally块中有return所以提前退出
-
E:try{} catch(){return;}finally{return;}
- 程序执行catch块中return之前(包括return语句中的表达式运算)代码
- 再执行finally块,因为finally块中有return所以提前退出。
-
F:try{ return;}catch(){return;} finally{return;}
- 程序执行try块中return之前(包括return语句中的表达式运算)代码;
-
有异常
- 执行catch块中return之前(包括return语句中的表达式运算)代码
- 则再执行finally块,因为finally块中有return所以提前退出
- 无异常:则再执行finally块,因为finally块中有return所以提前退出。
-
总结
- 1、不管有木有出现异常,finally块中代码都会执行;
- 2、当try和catch中有return时,finally仍然会执行;
- 3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
- 4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
-
最终结论
- 任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。
- 如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,
编译器把finally中的return实现为一个warning。