finally
finally代码块 : 定义一定执行的代码
通常用于关闭资源,因为资源必须释放
注:只有一种情况,finally是不会执行的:当catch中有System.exit(0).
public void method(){
连接数据库
数据操作; (可能会出现有一些异常:throw new SQLException)
关闭数据库; 如果数据操作出现异常,则抛出了异常,函数就结束了,数据库没有被关闭,资源则一直被使用
}
public void method1(){
try{
连接数据库
数据操作;
}catch(SQLException e){
数据库异常处理方式
}finally {
关闭数据库 (无论数据操作是否成功,最终都要关闭数据库释放资源)
}
}
异常在子父类覆盖中的体现
- 子类在继承父类时,如果父类的方法抛出异常,那么子类覆盖的方法只能抛出父类的异常或者该异常的子类
class AException extends Exception { // A异常
}
class BException extends AException { //B异常继承了A异常
}
class CException extends Exception { //C异常
}
class fu {
public void div() throws AException { //父类抛出A异常
}
}
class zi extends fu {
public void div() throws BException { //子类可以抛出B异常或者A异常,不能抛出C异常
}
}
- 如果父类抛出多个异常,那么子类覆盖该方法时,只能抛出父类存在的异常或异常子类
- 果父类或者借口方法中没有异常抛出,那么子类覆盖方法时,也不可以有异常抛出
如果子类方法发生了异常,就try/catch 内部处理
异常练习
/*
长方形,圆形 求面积
长方形的长宽,园的半径不能为负数和零,否则视为异常
当调用者输入了负数,则程序终止,需要调用者修改输入值才可以
*/
class ValuesException extends RuntimeException { //自定义 值异常,该异常继承RuntimeException
ValuesException() {
}
ValuesException(String msg) {
super(msg);
}
}
class Rectangle { //长方形类
private int lenght, width; //定义长宽
Rectangle(int lenght, int width) {
if (lenght <= 0 || width <= 0) {
throw new ValuesException("长和宽的数值异常"); //如果长宽为负数,则抛出一个异常
}
this.lenght = lenght;
this.width = width;
}
public void geArea() {
System.out.println("长发形面积:" + lenght * width);
}
}
class Circular {
private int radius;
public static final double PI = 3.14; //定义PI常量
Circular(int radius) {
if (radius <= 0) {
throw new ValuesException("圆的半径值异常");
}
this.radius = radius;
}
public void getArea() {
System.out.println("圆的面积:" + radius * radius * PI);
}
}
public class DEMO {
public static void main(String[] args) {
Rectangle r = new Rectangle(-1, 5);
r.geArea();
Circular c=new Circular(1);
c.getArea();
}