七海的java学习笔记(十一)

第十一章 异常处理

        异常机制
                异常就是程序在运行时出现的不正常情况。
                假设你调用了一个不是自己写的方法,该方法执行某些有风险的任务,可能会在运行期间出状况,你必须认识到该方法是有风险的,你得写出可以在发生状况是加以处理的程序代码,未雨绸缪。
                Java的异常处理机制是个简捷、轻量化的执行期间例外状况处理方式,它让你能够将处理错误情况的程序代码摆在一个容易阅读的位置。这要依赖你已经知道所调用的方法是有风险的(也就是方法可能会产生异常),因此你可以编写出处理此可能性的程序代码。如果你知道调用某个方法可能会有异常情况,你就可以预先准备好对问题的处理程序,甚或是从错误中恢复。
                你要如何得知某个方法会抛出异常呢?看到该方法的声明有throws语句就知道了。

                如果你把有风险的程序代码包含在try/catch块中,那么编译器会放心很多。

                try/catch块会告诉编译器你确实已经知道所调用的方法会有风险,并且也已经准备好要处理它,它只会注意你有没有便是你会注意到异常。

try{
     //把有风险的程序放在try块
}catch(Excepotion ex){
     //catch块摆放异常状况的处理程序,这一段只会在有抛出异常时执行
}

                异常是一种Exception类型的对象。因为它是对象,所以你catch住的也是对象。上面的程序代码中catch的参数是Exception类型的ex引用变量。

                 你写在catch块中的程序必定与所抛出的异常有关。例如,如果遇到服务器出故障的异常,你可能会在这里写寻找替代服务器的方法。

                 当你的程序代码调用有风险的方法时,也就是声明有异常的方法,就是该方法把异常丢给你的。

                 实际上,两者可能都是你自己写的。由谁写的程序其实并不重要,重点在于哪个方法抛出异常与哪个方法抓住它。

                 在编写可能会抛出异常的方法时,它们都必须声明有异常。

                 1. 有风险、会抛出异常的程序代码:

public void takeRisk()throws BadException{
      if(abandonAllHope){
             throw new BadException();//创建异常对象并抛出
      }
}

                 2. 调用该方法的程序代码:

public void crossFingers(){
       try{
           takeRisk();
       }catch(BadException ex){
           ex.printStackTrace();//如果无法从异常中恢复,至少也要使用printStackTrace()来列出有用的信息
       }     
}

                 方法可以抓住其他方法所抛出的异常。异常总是会丢回给调用方。会抛出异常的方法必须要声明它有可能会这么做。

                 Exception中有一个特殊的子类异常:RuntimeException(运行时异常)。如果在函数上声明了该异常,调用者可以不用进行处理。编译一样通过,之所以不用在函数进行声明,是因为不需要让调用者进行处理,当该异常发生,希望程序停止,因为在运行时出现了无法继续运算的情况,希望停止程序后对代码进行修正


        try/catch流程控制
                 
try{
    Foo f = x.doRiskyThing();
    int b = f.getNum();
}catch(Exception ex){
    System.out.println("failed");
}
System.out.println("We made it");
                如果成功的话,执行完try块中的内容后就不会执行catch块中的内容,会跳过catch块直接运行下面的代码。
                如果失败的话,比如在
Foo f = x.doRiskyThing();
                这行出现了异常,那么就不会执行
    int b = f.getNum();
                try中剩下的代码,直接执行catch块中的代码。

                finally:无论如何都要执行的部分

                finally是用来存放不管有没有异常发生都得执行的程序(通常用来关闭连接)。

                

        对多异常的处理
                有些方法可能会抛出多个异常。
                声明异常时,建议声明更为具体的异常,这样处理的可以更具体。
                对方声明几个异常,就对应有几个catch块,不要定义多余的catch块, 如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。
                建议在进行catch处理时,catch中一定要定义具体的处理方式,不能简单定义一句e.printStackTrace(),也不要就简单的写一条输出语句。
                

        异常在子父类覆盖中的体现
                1. 子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法只能抛出父类的异常或者该异常的子类。
                2. 如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。
               3. 如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。如果子类方法发生了异常,就必须要在内部进行try处理,绝对不能抛。

        

        throw和throws的区别
                throws使用在方法上,后面跟的是异常类,可以跟多个,用逗号隔开。
                throw使用内方法内,后面跟的是异常对象。

          不需要处理异常的时候,可以在方法上将接受到的异常继续抛出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值