JAVA学习总结之异常处理

异常(Exception):
    java把所有的异常分为两种:Checked异常和Runtime异常,Java认为Checked异常都是可以再编译阶段被处理的异常,所以它强制处理所有的Checked异常
    (必须要对底层抛出来的受检异常进行处理,处理方式有try...catch...或者向上抛出(throws),否则程序无法通过编译。);
    而Runtime异常则无需处理。
特点:
    无论是受检异常(Checked Exception)还是运行时异常(Runtime Exception),如果异常没有被应用程序捕获,那么最终这个异常会交由JVM来进行处理,会明显出现下面两个结果:
    1. 当前线程会停止运行,异常触发点后面的代码将得不到运行。
    2. 异常栈信息会通过标准错误流输出。

    java把所有的异常分为两种:异常(Exception)和错误(Error),它们都继承Throwable类。

    1.Error : 一般指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败等,这些错误无法恢复或不可能捕获,将导致应用程序中断。

    2.Exception :是应用程序中可能的可预测、可恢复问题。一般大多数异常表示中度到轻度的问题。异常一般是在特定环境下产生的,通常出现在代码的特定方法和操作中。

注意:捕获异常时,一定要先捕获小异常,再捕获大异常。即:
    在catch异常时,如果有多个异常,是有顺序要求的。子类型必须要在父类型之前进行catch,
     catch与分支逻辑是一致,如果父类型先被catch,那么后被catch的分支根本得不到运行机会。

try catch finally 用法:
    1、将预见可能引发异常的代码包含在try语句块中。
    2、如果发生了异常,则转入catch的执行。catch有几种写法:
        catch
            这将捕获任何发生的异常。
        catch(Exception e)
            这将捕获任何发生的异常。另外,还提供e参数,你可以在处理异常时使用e参数来获得有关异常的信息。
        catch(Exception的派生类 e)
            这将捕获派生类定义的异常
        catch可以有多个,也可以没有,每个catch可以处理一个特定的异常。如果没有catch块,异常总是向上层(如果有)抛出,或者中断程序运行。

    3、finally
        finally可以没有,也可以只有一个。无论有没有发生异常,它总会在这个异常处理结构的最后运行。即使你在try块内用return返回了,在返回前,finally总是要执行,这以便让你有机会能够在异常处理最后做一些清理工作。如关闭数据库连接等等。
        注意:如果没有catch语句块,那么finally块就是必须的。
        顺便说明,return是可以放在try语句块中的。但不管在什么时机返回,在返回前,finally将会执行。

总结:
    try { //执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容 }

    catch { //除非try里面执行代码发生了异常,否则这里的代码不会执行 }

    finally { //不管什么情况都会执行(保证一定能回收try块中打开的物理资源),包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally

系统自动抛出的异常:
    所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,
    并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行。

语句抛出的异常:
    用户程序自定义的异常和应用程序特定的异常,必须借助于 throws 和 throw 语句来定义抛出异常

throw是语句抛出一个异常。
    语法:throw (异常对象);
             throw e;

throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)
    语法:[(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{......}
                public void doA(int a) throws Exception1,Exception3{......}
注意:throws声明抛出异常时有一个限制--子类方法声明抛出的异常类型应该是父类方法声明抛出的异常类型的子类或相同,
    子类方法声明抛出的异常不允许比父类方法声明抛出的异常多。
 
throw和throws比较:
    throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。
    throws语句用在方法声明后面,表示再抛出异常,由该方法的调用者来处理。

    throws主要是声明这个方法会抛出这种类型的异常,使它的调用者知道要捕获这个异常。
    throw是具体向外抛异常的动作,所以它是抛出一个异常实例。

    throws说明你有那个可能,倾向。
    throw的话,那就是你把那个倾向变成真实的了。

同时:
    1、throws出现在方法函数头;而throw出现在函数体。
    2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。
    3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值