异常总结
1 在java中异常被当作对象来处理,根类是java.lang.Throwable类,异常分为两大类:Error和Exception
2 Error是无法处理的异常,一般发生这种异常,JVM会选择终止程序,所以编写程序时不需要在意这些异常
3 Exception类的异常包括checked exception和unchecked exception
unchecked exception(非检查异常),也称运行时异常(RuntimeException)。对于运行时异常,java编译器不要求必须进行异常捕获处理或者抛出声明,由程序员自行决定
checked exception(检查异常),也称非运行时异常,java编译器强制程序员必须进行捕获处理,对于非运行时异常如果不进行捕获或者抛出声明处理,编译都不会通过
在java中,所有异常类的父类时Throwable类,Error类时error类型异常的父类,Exception类是exception类型异常的父类,RuntimeException类是所有运行时异常的父类,RuntimeException以外的并且继承Exception的类是非运行时异常。
典型的RuntimeException包括NullPointerException、IndexOutOfBoundsException、IllegalArgumentException等。
典型的非RuntimeException包括IOException、SQLException等。
4 对异常的处理
1 try...catch
try{...}
catch(异常类名 变量名)
{异常的处理代码}
被try块包围的代码说明这段代码可能会发生异常,一旦发生异常,便会被catch捕获,然后在catch块中进行异常处理
2 throw和thorws 格式 throws 异常类名 //这个格式是跟在方法的括号后面的
* 如果采用throws,将来谁调用谁处理
throws throw
用在方法声明后面,跟的是异常类名 用在方法体内,跟的是对象名
表示抛出异常,由该方法的调用者来处理 表示抛出异常,由方法体内的语句来处理
表示出现异常的可能性,并不代表一定会有异常 执行throw一定出现了某种异常
public void checkScore(int score) throws ScoreException
{
if(score<0||score>100){
throw new ScoreExcrption("你给的分数有误");
}
else{
System.out.println("分数正常");
}
}
5 finally关键字
try无法单独使用,必须配合catch或finally使用,java编译器允许的组合形式由以下三种:
try...catch; try...finally; try...catch...finally...
catch块可以有多个,但是try只能有一个,finally块是可选的(但是最多只能有一个finally)
三个块执行的顺序是try——catch——finally
如果没有异常,catch不会执行,但是finally一定会执行(因此部分情况下,都会将释放资源的操作放在finally块中进行)
在使用try...catch..finally块的时候,千万不要再finally块中使用return,因为finally中的return会覆盖已有的返回值
6 类继承时,方法覆盖时如何进行异常抛出声明
三点原则:1 父类方法没有生命异常,子类重写该方法时不能声明异常
2 如果父类的方法声明一个异常exception1,则子类在重写该方法的时候声明的异常不能是exception1的父类;
3 如果父类的方法声明的异常类型只有非运行时异常(运行时异常),则子类在重写该方法的时候声明的异常也只能有非运行时异常(运行时异常),不能含有运行时异常(非运行时异常)。
7 异常处理和设计的几个建议
1 只在必要时使用异常,不要用异常去控制程序的流程
2 切忌使用空catch块
空的catch块意味着在程序中隐藏了错误和异常,并且很可能导致程序出现不可控的执行结果
3 注意catch块的顺序
不要把上层类的异常放在最前面的catch块
4 不要将提供给用户看的信息放在异常信息里
展示给用户错误提示信息最好不要跟程序混淆一起,比较好的方式是将所有错误提示信息放在一个配置文件中统一管理。
5 避免多次在日志信息中记录同一个异常
只在异常最开始发生的地方进行日志信息记录。很多情况下异常都是层层向上跑出的,如果在每次向上抛出的时候,都Log到日志系统中,则会导致无从查找异常发生的根源。
6 异常处理尽量放在高层进行
尽量将异常统一抛给上层调用者,由上层调用者统一指示如何进行处理。如果在每个出现异常的地方都直接进行处理,会导致程序异常处理流程混乱,不利于后期维护和异常错误排查。由上层统一进行处理会使得整个程序的流程清晰易懂。
7 在finally中释放资源
如果有使用文件读取、网络操作以及数据库操作等,记得在finally中释放资源。这样不仅会使得程序占用更少的资源,也会避免不必要的由于资源未释放而发生的异常情况。

浙公网安备 33010602011771号