目录
3、掌握异常的处理-捕获异常try、catch和finally
5、了解finally与return和System类的exit方法
1、掌握异常的概念
- 异常(Exception):异常指的是程序运行时发生的不正常事件;异常能够被程序处理,保证程序继续运行下去;例如除数为0、文件没有找到、输入的数字格式不对……
- 错误(Error):错误程序没法处理,例如内存泄漏。发生错误后,一般虚拟机会选择终止程序运行,程序员需要修改代码才能解决相关错误;
2、熟悉异常结构及常见运行时异常
异常层次关系:
- API中标准异常的顶级父类是Throwable类;
- Throwable类有两个子类:Exception和Error;所有异常都是Exception类的直接或间接子类;所有错误都是Error的直接或间接子类;
- Exception有很多子类;这些子类又可以分为两大类;
- 即运行时异常和非运行时异常;RuntimeException的子类都是运行时异常,其他的都是非运行时异常;
- 运行时异常:也称为非检测异常(unchecked Exception), 这些异常在编译期不检测,程序中可以选择处理,也可以不处理。如果不处理运行时会中断,但是编译没问题;
- 非运行时异常:也称为检测异常(checked Exception), 是必须进行处理的异常,如果不处理,将发生编译期错误;
示例:
-
String s=""; System.out.println(s.length()); 输出结果是:0
-
String s=null; System.out.println(s.length()); 运行会报空指针异常
3、掌握异常的处理-捕获异常try、catch和finally
idea中提供了创建try...catch...finally的快捷键,你可以选中需要放入try{}中的语句,按Ctrl+Alt+t
(你会惊喜的发现,if...else也可以使用同样的方法添加)
程序一但出现异常就会中断运行
格式:
- 当try块中中代码抛出了异常对象后,异常处理机制就将这个对象的类型与try后的catch语句中的异常类型进行匹配,如果类型相同,或者抛出的是捕获的子类,就称为匹配成功,那么异常就被捕获,就运行catch块中的语句;否则,称为异常没有被捕获,程序将中断;
- 抛出异常,但是没有被处理 示例:
- 抛出异常,但是没有被处理 示例:
- 没有抛出异常 示例:
catch语句里都写什么代码?
- 可以写任意需要对异常进行处理的代码;
- 可以调用异常对象的方法,例如printStackTrace,查看异常发生的栈轨迹
- 如果try块中有多行代码,有可能抛出多种类型异常,那么可以使用多个catch语句;
- 注意:catch语句的异常类型必须从子类到父类的顺序,否则编译错误;
示例;
我们可以发现程序中有这样几种情况:
- 没抛出异常;
- 抛出异常并被处理了;
- 抛出异常没有被处理;
如果希望不管什么情况,有一些代码都必须被执行,那么就可以把这些代码写到finally块中;
一般用于资源的清理和释放工作。如:关闭已打开的文件、删除临时文件、释放数据库连接
注意:
- 必须有try,catch可以有1个或多个,finally最多1个,可以没有,不能有多个;
- 还有另外一种组合:只有try和finally,没有catch
- 如果try块中抛出了异常,则肯定不能被捕获,程序中断,但是finally代码块依然会被执行;
4、掌握异常的处理-层层抛出
抛出异常其实就是创建了一个异常对象,然后用throw关键字交给异常处理机制去处理
throws用在方法声明处,声明该方法可能发生的异常类型;
5、了解finally与return和System类的exit方法
- 在try中没有异常的情况下try、catch、finally的执行顺序 try --- finally
如果try中有异常,执行顺序是try --- catch --- finally
- 如果try中没有异常并且try中有return这时候正常执行顺序是try ---- finally --- return
如果try中有异常并且try中有return这时候正常执行顺序是try----catch---finally--- return
- 如果try有异常,相应catch中有return,顺序是try---catch---finally---return
总之 finally 永远执行!除非前面有System.exit(0)退出虚拟机
System.exit(参数); 参数: 0 或 1 都代表退出虚拟机
6、掌握自定义异常
- 如果抛出的是API中的标准异常,那么很可能与API中方法抛出的异常混淆,因此需要自定义异常;
- 自定义异常类非常简单,只要继承API中任意一个标准异常类即可;
- 多数情况下,继承Exception类;也可以选择继承其他类型异常;
- 一般自定义异常类中不写其他方法,只重载必要的构造方法;
- 使用自定义异常与使用API中标准异常一样;
- 可以用throw抛出自定义异常对象,使用throws声明自定义异常类型;
- 可以使用try/catch/finally处理异常;