Java中的异常处理
异常定义
异常 - 程序中的错误。
编译时异常 - 编译时出现的错误;
运行时异常 - 程序运行时发生的错误,程序会终止于发生错误的语句;
Throwable 类 是所有Java异常 的 父类 ;Error 类(不讨论,无法挽救)、 及 Exception 类 是其子类;
异常分类
1、非检查性异常 - 在编译时不检查该错误,只在运行时才会发生;也就是说,如果程序中的某条语句有潜在的发生
非检查性异常的风险时,程序还是会通过编译的;所有RuntimeException以及其子类的异常都属于非检查性异常;
2、检查性异常 - 除了 RuntimeException之外的 Exception的子类异常 都是检查性异常;检查性异常必须处理,否则不会通过编译;
异常处理
1、自行处理
1 try{ 2 //try块 3 //有可能发生异常的语句,放到try块中运行; 4 //如果try块中没有发生异常,try运行结束后,会继续catch后面的代码运行; 5 //如果一旦发生异常。程序就会中止于发生错误的语句,根据异常种类,继续到catch块中去运行; 6 }catch(Exception e){ 7 //catch块 8 //任一catch块运行完以后,所有catch捕捉结束,会继续运行catch后面的代码; 9 //Exception e 作为兜底,当有其他catch语句时,exception e 必须放在最后; 10 }finally{ 11 //必须执行的代码;即使try块中有return语句或者break语句跳出循环; 12 //收尾工作的代码;比如说关闭打开的文件、关闭网络连接、关闭数据库连接; 13 //除非使用了System.exit(0)语句时,finally代码块中的内容不被执行; 14 }
2、向上抛出 - throws
throws - 声明方法有可能会抛出什么类型的异常;
- 由方法的调用者进行异常处理;
自定义异常
throw - 用法格式: throw 异常对象;
throw new 自定义异常类名();
总结
思考:何时使用throw向上抛出,何时使用try、catch自行处理?
其实只要稍稍换位思考,这个问题不难回答,如果方法层的上一层需要知道是否发生了异常,则向上抛出;
如果方法层的上一层只需要返回结果,并不需要知道是否发生过异常,则try、catch处理。