面向对象-Exception

异常

定义

  • 对问题的描述,将问题进行对象的封装

异常体系

Throwable
    |--Exception
        |--RuntimeException
        |--...
        |--XxxxException
    |--Error

异常体系的特点

  • 异常体系中的所有类与对象都具有可抛性
  • 也就是说都可以被throwthrows所操作
  • JAVA中只有异常体系具备这一特点

throw和throws的用法

  • throw定义在函数内,用于抛出异常对象
  • throws定义在函数上,用于声明异常类,可以同时声明多个异常类,用逗号隔开
  • 当函数中有throw抛出异常对象,并且没有进行try catch处理,必须在函数上通过hrows声明异常,否则编译失败

RuntimeException类异常除外,如果函数中抛出此异常,函数上可以不用声明

  • 如果函数声明了异常,调用者在调用时可以继续抛出异常,也可以通过try catch处理此异常

异常分为两种:

  • 编译时被检测异常
    • 该异常在编译时如果没有处理,编译失败
    • 该异常被标识,代表着可以被处理
  • 运行时异常(编译时不检测)
    • 在编译时不需要处理,编译器不检测
    • 该异常的发生,建议不处理,让程序停止并对代码进行修正

异常处理语句

try{
    需要被检测的代码
}
catch(捕获的异常对象){
    处理异常的代码
}
finally{
    一定会被执行的代码
}

异常的三种编写格式

第一种:
try{

    } catch(  ){

    }

    第二种:
try{

    } catch(  ){

    } fianlly{

    }

    第三种:
    try{

    } finally{

    }

注意:
finally中通常定义的是关闭资源代码,因为资源必须被释放。
finally语句中的代码只有一种情况下不会被执行,就是当执行到System.exit(0);


自定义异常

  • 定义类继承Exception或RuntimeException
    • 为了让该自定义类具备可抛性
    • 让该类具备操作异常的共性方法
  • 当要定义自定义类的异常信息时,可以使用父类已经定义好的功能,让子类异常信息传递给父类的构造函数:
class MyException extends Exception{
    MyException(String message){
        super(message);
    }
}
  • 按照JAVA的面向对象的思想,将程序中出现的特有问题进行封装

异常的好处

  • 将问题进行封装
  • 将正常流程代码和问题处理代码相分离,便于阅读

异常的处理原则

  • 处理方式:try 和 throws
  • 调用到抛出异常的功能时,抛出几个就要处理几个:一个try对应多个catch
  • 多个catch,父类的catch放到最下面
  • catch内需要定义针对性的处理方式,不要简单地定义printStackTrace、输出语句,也不要不写
  • 当捕获到的异常,本功能处理不了时,可以继续在catch中抛出
    try{
        throw new AException();
    } catch (AException e){
        throw e;
    }
  • 如果该异常处理不了,而且并不属于该功能出现的异常,可以将该异常转换后抛出和该功能相关的异常
  • 或者该异常可以处理,但需要将该异常产生的和本功能相关的问题提供出去,让调用者知道并处理;也可以将捕获到的异常处理后,转换新的异常
    try {
        throw new AException();
    } catch (AException e){
        //对AException先进行处理
        throw new BException();
    }

异常的注意事项

  • 在子类覆盖时
    • 子类抛出的异常必须是父类异常的子集或子类
    • 如果父类或者接口没有异常抛出时,子类覆盖异常出现异常,只能try不能抛

子父类异常示例

class BlueScriptException extends Exception{
    BlueScriptException(String message){
        super(message);
    }
}

class BrokenException extends Exception{
    BrokenException(String message){
        super(message);
    }
}

class NoPlanException extends Exception{
    NoPlanException(String message){
        super(message);
    }
}

class Computer{
    private int state = 3;
    public void run()throws BlueScriptException,BrokenException{
        if(state == 2)
            throw new BlueScriptException("电脑蓝屏了");
        if(state == 3)
            throw new BrokenException("电脑坏掉了");
        System.out.println("电脑运行");
    }
    public void reset(){
        System.out.println("电脑重启");
    }
}

class Teacher{
    private String name;
    private Computer cmt;
    Teacher(String name){
        this.name = name;
        cmt = new Computer();
    }
    public void tech()throws NoPlanException{
        try{
        cmt.run();
        System.out.println("老师开始上课");
        }
        catch(BlueScriptException e){
        System.out.println(e.getMessage());
        cmt.reset();
        }
        catch(BrokenException e){
        System.out.println(e.getMessage());
        throw new NoPlanException("课时进度无法继续");
        }
    }
    public void test(){
        System.out.println("同学们做练习题");
    }
}
class ExceptionTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Teacher t = new Teacher("蒋老师");
        try{
            t.tech();       
        }
        catch(NoPlanException e){   
            t.test();
            System.out.println("test原因:"+e.getMessage());
        }
    }
}

输出结果:
电脑坏掉了
同学们做练习题
test原因:课时进度无法继续

RuntimeException异常示例

interface Mir {
    void mianji();
}
class Rec implements Mir{
    private double len,wid;
    Rec(double len,double wid){
        if(len<=0 || wid<=0)
            throw new NoValueException("长或宽数据不合法,请重新输入");
        this.len = len;
        this.wid = wid;
    }
    public void mianji(){
        System.out.println("长方形面积 = "+len*wid);
    }
}
class Circle implements Mir{
    private double ricl;
    public static final double PI = 3.14;
    Circle(double ricl){
        if(ricl<=0)
            throw new NoValueException("半径不合法,请重新输入");
        this.ricl = ricl;
    }
    public void mianji(){
        System.out.println("圆形面积 = "+ricl*ricl*PI);
    }
}
class NoValueException extends RuntimeException{
    NoValueException(String message){
        super(message);
    }
}
class ExceptionTest2 {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        try{
        Rec r = new Rec(4,5);
        r.mianji();
        
        Circle c = new Circle(-5);
        c.mianji();
        } catch(NoValueException e){
            System.out.println(e.toString());
        }
    }
}

输出结果:
长方形面积 = 20.0
ExceptionTest2.NoValueException: 半径不合法,请重新输入
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,531评论 18 399
  • Java异常类型 所有异常类型都是Throwable的子类,Throwable把异常分成两个不同分支的子类Erro...
    予别她阅读 912评论 0 2
  • JAVA异常与异常处理详解 一、异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在jav...
    java大湿兄阅读 990评论 0 11
  • -------android培训java培训期待与您交流!---------- 1. Object类 是所有对象的...
    狼孩阅读 366评论 0 3
  • 走走停停,拍一拍,尝一尝,岁月静好,生活美好!旅行,给自己的心放个假,放松自己,在旅途中去获得新的认知,收获不同的...
    夜色光影阅读 219评论 0 0