finally
当用户在访问类似数据库的操作,数据库连接资源有限,当使用完成后需要释放资源,就是用到finally
1. 连接数据库
2. 数据库操作 // 异常的多发地
3. 关闭数据库
// 记住一点: catch 是用于处理异常.如果没有 catch 就代表异常没有被处理过,如果该异常时检测异常,那么就必须声明 try{
}catch{
}finally
try{
}finally{ //关资源 }
一种情况finally 不会执行-那就是System.exit(0);
当父类方法抛出一个拥有子父级关系的异常,子类继承了父类并复写了父类的方法,子类不能抛出最新的异常,只能抛出父类的异常.
如果一个类方法使用了父类方法并 try catch 抛出异常为父类的,子类传入这个方法时如果时新异常就会报错
- 子类再覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类
- 如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集
- 如果父类或者接口的方法中没有异常抛出,那么子类再覆盖方法时也不可以抛出异常. 如果子类方法发生了异常,就必须 try catch 绝对不能抛
当开发过程中,如果出现问题,就不需要if 判断,尽量使流程代码,与问题处理分开来。好的方式就是自定义异常,配合继承Exception 或者 RuntimeException (两者区别使 后者 不需要throws and try catch 直接停止 )
总结 :
-
异常是对问题的描述. 将问题进行对象的封装.
-
异常体系:
Throwable |--Error |--Exception |--RuntimeException -
异常体系的特点:异常体系中所有类以及建立的对象都具备可抛性.也就是说可以被 throw 和 throws 关键字所操作。
-
throw 和 throws 的用法: throw 定义在函数内,用于抛出异常对象
throws 定义在函数上,用于抛出异常类,可以抛出多个用逗号隔开。 -
当函数内有throw 抛出异常对象,并未进行try 处理,必须在函数上声明,否则编译失败。注意:RuntimeException 除外,也就是说,函数内如果抛出的RuntimeException 函数不用声明
-
如果函数声明了异常,调用者需要进行处理,处理方法可以 throws 可以try
-
异常有两种:
- 编译时被检测异常-该异常在编译时,如果没有处理(无throw 和 try 编译失败)
- 运行时异常(编译时不检查)
异常的好处:
- 将问题进行分装
- 正常代码与问题处理代码分离
异常的处理原则:
- 处理方式有两种:try 或者 throws
- 调用抛出异常,抛出1几个,catch 几个
- 多个catch ,父类的catch放在最下面
- 如果异常处理不了,但并不属于该功能出现的异常。可以将异常转换后,在抛出和该功能相关的异常。
异常的注意事项: 在子父类覆盖时:
- 子类抛出的异常必须是父类的异常的子类或者子集。
- 如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛