博客信息

面向对象之异常(异常处理的其他格式、异常在子父类覆盖中的体现)

发布时间:『 2019-05-26 18:55』  博客类别:java基础  阅读(635)

异常处理的其他格式

记住一点:catch是用于处理异常,如果没有catch就代表异常没有被处理过,如果该异常是被检测时异常,那么必须声明;

那么下面这个异常处理的格式通常用来干什么的呢?

 

Try{

Throw new Exception();

}finally{

//关闭资源

}

 

在一个函数中,可以涉及了多项操作,以及资源的设计,由于某些需求的原因,异常不能在本函数中进行处理,需要在调用方进行处理,而调用方又不再需要使用对应资源,那么就需要采用以上异常处理格式,将资源进行关闭。

 

异常在子父类覆盖中的体现

1、子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类;

2、如果父类的方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集;

3、如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常;

如果子类方法发生了异常,就必须要进行try处理,绝对不能抛;

 

相关代码

package com.javaxl.object;

/**
 * @author 小李飞刀
 * @site www.javaxl.com
 * @company
 * @create  2019-05-26 11:54
 */
public class ObjectDemo7 {

}

abstract class ExceptionFu{
    public void show() throws AException{

    }

    public void write() throws AException,CException{

    }

    public abstract void eat();
}

//覆写show方法声明AException、BException编译通过,声明CException编译不通过
class ExceptionZi1 extends ExceptionFu{
    @Override
    public void show() throws /*AException*/BException {
    }

    @Override
    public void eat() {

    }

}
//覆写write方法,可以声明父类所声明的异常的子集
class ExceptionZi2 extends ExceptionFu{
    @Override
    public void write() throws AException,CException {
    }

    @Override
    public void eat() {

    }

}

//覆写eat方法,父类定义的函数上没有声明异常,子类也不能有,只能在子类覆写的函数内部做try-catch处理
class ExcZi3 extends ExceptionFu{

    @Override
    public void eat() /*throws CException*/{

    }

}

class AException extends Exception{

}

class BException extends AException{

}

class CException extends Exception{

}

 

需求:有一个圆形和长方形,都可以获取面积,对于面积如果出现非法的数值,视为是获取面积出现问题,问题通过异常来表示。

package com.javaxl.object;

/**
 * @author 小李飞刀
 * @site www.javaxl.com
 * @company
 * @create  2019-05-26 12:05
 */
public class ObjectDemo8 {
    public static void main(String[] args) {
//        new Rec(3,4).getArea();
//        new Circle(6).getArea();

        new Rec(3,-4).getArea();
        new Circle(-6).getArea();
    }
}

interface Shape{
    public void getArea();
}

class Rec implements Shape{
    private int x;
    private int y;
    Rec(int x,int y){
        if(x < 0 || y < 0){
            throw new NoValueException("长宽不能为负数,出错了!!!");
//            System.out.println("长宽不能为负数,出错了!!!");
        }
        this.x = x;
        this.y = y;
    }

    @Override
    public void getArea() {
        System.out.println(x * y);
    }
}

class Circle implements Shape{
    public static final double PI = 3.14;
    private int r;

    public Circle(int r) {
        if(r<0)
            throw new NoValueException("圆半径不能为负数,出错了!!!");
        this.r = r;
    }

    @Override
    public void getArea() {
        System.out.println(r * r * PI);
    }
}

class NoValueException extends RuntimeException{
    NoValueException(String msg){
        super(msg);
    }
}


该需求完成后,我们要理解两个问题

if else可以处理的问题,为什么要使用异常来处理?

RuntimeException的应用场景?

 

If else来处理程序的问题,会使得代码非常臃肿,代码的可读性不高。用异常机制来处理的话,可以将正常运行的代码块与非正常运行的代码块分离,try里放的正常逻辑处理的代码块,catch中是非正常运行的代码块。

 

有些代码在执行过程中出错,没有必要再执行下去了,因为执行下去没有任何意义,执行后的结果肯定是错误的,这个时候我们需要在执行到错误代码的时候让程序停止。就像需求中传入半径为负数,算出的结果没有意义是一样的。






关键字:     Java基础       面向对象       异常  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有