• Java学习笔记-异常


    在程序编写中,难免会产生异常,这时候就需要对异常进行处理

    异常

    异常的体系

    Throwable
    Error

    • 通常出现重大问题如:运行的类不存在或者内存溢出等
    • 不编写针对代码对其处理

    Exception

    • 在运行时运行出现的一起情况,可以通过try catch finally

    Exception和Error的子类名都是以父类名作为后缀

    Throwable中的方法

    • getMessage()
      获取异常信息,返回字符串

    • toString()
      获取异常类名和异常信息,返回字符串

    • printStackTrace()
      获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void

    • printStackTrace(PrintStream s)
      通常用该方法将异常内容保存在日志文件中,以便查阅

    throws和throw

    • throws用于标识函数暴露出的异常

    • throw用于抛出异常对象

    • throws与throw的区别:

      • thorws用在函数上,后面跟异常类名
      • throw用在函数内,后面跟异常对象

    异常处理

    try {
        需要检测的代码;
    } catch(异常类 变量){
        异常处理代码;
    } finally {
        一定会执行的代码;
    }
    
    try {
        //需要检测的代码;
    } catch(Exception e){
        //异常处理代码;
    }
    
    try {
        //需要检测的代码;
    } finally{
        //一定会执行的代码;
    }
    

    Finally代码块只有一种情况不会被执行。就是在之前执行了System.exit(0)

    自定义异常

    自定义类继承Exception或者其子类

    通过构造函数定义异常信息
    例:

    Class DemoException extends Exception {
        DemoException(String message) {
            super(message);
        }
    }
    

    通过throw将自定义异常抛出

    throw new DemoException();
    

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

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

    异常的好处

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

    异常的处理原则

    1,处理方式有两种:try 或者 throws。
    2,调用到抛出异常的功能时,抛出几个,就处理几个。
    一个try对应多个catch。
    3,多个catch,父类的catch放到最下面。
    4,catch内,需要定义针对性的处理方式。不要简单的定义printStackTrace,输出语句。也不要不写。
    当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。

    try{
        throw new AException();
    } catch (AException e) {
        throw e;
    }
    

    如果该异常处理不了,但并不属于该功能出现的异常。
    可以将异常转换后,在抛出和该功能相关的异常。

    或者异常可以处理,当需要将异常产生的和本功能相关的问题提供出去,
    当调用者知道。并处理。也可以将捕获异常处理后,转换新的异常。

    try {
        throw new AException();
    } catch (AException e) {
        // 对AException处理。
        throw new BException();
    }
    

    异常的注意事项:

    在子父类覆盖时:

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

    异常细节

    • RuntimeException以及其子类如果在函数中被throw抛出,可以不用在函数上声明
    • 一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类
    • 如果父类抛出多个异常,那么重写(覆盖)方法必须抛出那些异常的一个子集,不能抛出新的异常
    • 介绍异常在分层设计时的层内封装
    • finally中的代码无论如何都会执行,通常用于关闭资源
    • catch是用于处理异常。如果没有catch就代表异常没有被处理过,如果该异常是检测时异常。那么必须声明

    RuntimeException

    Exceptoin中有一个特殊的子类异常RuntimeException运行时异常
    如果在函数内容抛出该异常,函数上可以不用声明,编译一样通过
    如果在函数上声明了该异常。调用者可以不用进行处理。编译一样通过

    之所以不用在函数声明,是因为不需要让调用者处理
    当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正

    自定义异常时:如果该异常的发生,无法在继续进行运算,就让自定义异常继承RuntimeException

    对于异常分两种:

    1. 编译时被检测的异常
    2. 编译时不被检测的异常(运行时异常。RuntimeException以及其子类)
  • 相关阅读:
    Lucene:(一)建立索引文件:2。建立索引文件(一)
    Lucene:(一)建立索引文件:2。建立索引文件(二)Segment文件
    92.外边距设置 Walker
    99.元素居中及样式重置 Walker
    94.外边距踩坑 Walker
    101.列表属性 Walker
    97.boxsizing属性 Walker
    98.溢出隐藏 Walker
    95.内边距设置 Walker
    96.内边距和边框踩坑 Walker
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664860.html
Copyright © 2020-2023  润新知