zoukankan      html  css  js  c++  java
  • Java trycatch异常相关(part2)

    1.finally

    finally代码块:定义了一定会执行的代码,通常用于关闭资源。

    2.try-catch-finally的其他格式

     1 //第一个格式:
     2 try{
     3 
     4 }catch ()
     5 {
     6 
     7 }finally
     8 {
     9 
    10 }
    11 //第二个:
    12 try{
    13 
    14 }catch ()
    15 {
    16 
    17 }
    18 //第三个
    19 try{
    20 
    21 }finally
    22 {
    23 //关资源
    24 }

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

     3.异常在子父类覆盖时的特点

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

     1 class AException extends Exception
     2 {
     3 
     4 }
     5 class BException extends AException
     6 {
     7 
     8 }
     9 class CException extends Exception
    10 {
    11     
    12 }
    13 class Fu
    14 {
    15     void show()throws AException
    16     {
    17 
    18     }
    19 }
    20 class Zi extends Fu
    21 {
    22     void show()throws AException,BException//只能抛父类抛出的异常或者其异常的子类。
    23     {
    24         
    25     }
    26 }

    层级关系就像下面这样

    Exception

      |--AException

        |--BException

      |--CException

    很显然,只能抛出AException和BException,抛CException或者Exception会报错的。。

    理解起来也比较简单,子类再抛新异常,如果多态父类就解决不了了。

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

    这个也很好理解,只要让父类能解决,啥都好说。

    3.如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法的时候也不可以抛出异常。如果子类方法发生了异常,就必须要进行try处理。

    4.异常部分的总结

    ①异常就是对问题的描述,对问题进行封装。

        异常体系如下:

      Throwable

           |--Error

           |--Exception

             |--RunTimeException

      ②异常体系的特点:

    异常体系中的所有类以及建立的对象都具有可抛性,也就是说可以被throw和throws所操作。只有异常体系有这个特点。

    ③throw和throws的用法

    throw定义在函数内,用于抛出异常对象。

    throws定义在函数上用于抛出类,可以抛出多个并用逗号隔开。

    ④函数声明相关

    当函数内容有throw抛出异常对象,并未进行try处理,必须要在函数上声明,否则编译失败。但是RunTImeException除外。也就是说,函数内如果抛出RunTimeException异常,函数上可以不声明。

    如果函数声明了异常,调用者需要进行处理,处理方法可以是throw也可以try-catch。

    ⑤异常分类

    异常有两种:编译时异常和运行时异常。

    编译时异常:该异常在编译时,如果没有处理(没throw没try)就会编译失败。异常被标示了,就说明他可以被处理。

    运行时异常:编译时不检测,也不检查不处理。这种异常发生时建议就不要处理了,让程序停止,需要对代码进行修正。

    ④finally

    finally中定义的通常是关闭资源代码,因为资源必须释放。而且finally只有一种情况不会执行,就是执行到

    System.exit(0);

        finally不会执行。

    ⑤自定义异常

    按照Java面向对象的思想,将程序中出现的特有的问题进行封装。

    就是让定义的类继承Exception或者RuntimeException。一是为了让该自定义类具备可抛性,二是让该类具备操作异常的共性方法。

    当要定义自定义异常的信息时,可以使用父类已经定义好的功能,将异常信息传递给父类的构造函数。

    1 class MyException extends Exception
    2 {
    3     MyException(String message)
    4     {
    5         super(message);
    6     }
    7 }

    ⑥异常的好处

    一是将问题进行了封装,二是将正常流程代码和问题处理代码相分离,方便于阅读。

    ⑦异常的处理原则

    1.有两种处理方式:try或者throw

    2.调用到抛出异常的功能时,抛出几个就处理几个,一个try对应着多个catch

    3.多个catch,父类的catch放在最下面。

    4.catch内,需要定义针对性的处理方式,不要简单的定义printStacktrace和输出语句,也别不写。当捕获到的异常在本功能里面处理不了时,可以继续在catch里抛出。

    1     try
    2     {
    3         throw new AException;
    4     }
    5     catch(AException e;)
    6     {
    7         throw e;
    8     }

    如果该异常处理不了,但是并不属于该功能出现的异常,可以将异常转换后,再抛出和该功能相关的异常。或者异常可以处理,当需要将异常产生和本功能相关的问题提供出去,让调用者知道并处理。也可以将捕获异常处理后,转换新的异常。

    1    try
    2     {
    3         throw new AException;
    4     }
    5     catch(AException e;)
    6     {
    7         throw new BException;
    8     }

    ⑧异常的注意事项

    在子类覆盖时:

    1.子类抛出的异常必须是父类的异常的子类或者子集。

    2.如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。

    好了,Java异常全在这呢,比课本可是全多了。

  • 相关阅读:
    C语言内存调试技巧—C语言最大难点揭秘
    include .h 以及.cpp的记录
    VS2010中<无法打开包括文件:“iostream.h”:>错误解决方法
    #include<iostream>与#include<iostream.h>的区别
    VS2013/2012 下无法打开 源 文件“stdafx.h”的解决方法
    【Oracle】Oracle日期格式详解
    【EasyUI】 日期格式化
    【TortoiseGit】TortoiseGit将本地库push到远端
    【Tomcat】解决Eclipse无法添加Tomcat Service问题
    【Tomcat】配置Tomcat
  • 原文地址:https://www.cnblogs.com/KangYh/p/9791121.html
Copyright © 2011-2022 走看看