Java异常处理机制

Java异常处理机制

  • 1. 异常
    • 1.1 背景
    • 1.2 概述
    • 1.3 异常分类
    • 1.4 异常处理方式
      • 1.4.1 抓抛模型
      • 1.4.2 方式一: try-catch-finally
      • 1.4.3 方式二:throws+异常类型
      • 1.4.4 两种方式如何选择
    • 1.5 手动抛出异常throw
    • 1.6 自定义异常类

1. 异常

Java异常处理机制_第1张图片

1.1 背景

开发应用时,程序开发人员尽可能将代码编写完美,规避BUG的出现,但是理想很完美,现实很骨感,应用最终面对的受众是各式各样的,最终某些偶然问题会被某些用户触发,此时则需要提前对该问题进行一个处理,异常处理机制则可以很好解决这个问题。

1.2 概述

Java异常处理机制_第2张图片

1.3 异常分类

  • 继承自java.lang.Throwable类,分为java.lang.Error、java.lang.Exception,其中Error是不需要进行代码处理的;
  • java.lang.Exception指狭义异常,分为受查异常(编译时异常)、 非受查异常(运行时异常),需进行代码处理;

Java异常处理机制_第3张图片
异常分类?常见异常?
答:狭义异常指的是java.lang.Exception,分为受查异常和非受查异常,受查异常指编译时异常,而非受查异常指运行时异常。其中,常见的受查异常有IOException、ClassNotFoundException、CloneNotSupportedException;非受查异常有RuntimeException,包括ArithmeticException、ClassCastException、NullPointerException、NoSuchElementException、IndexOutOfBoundsException等。
Java异常处理机制_第4张图片

1.4 异常处理方式

  • try-catch-finally结构;
  • throws+异常类型;

两种方式的区别:
try-catch-finally结构的方式比较积极,发现异常并处理异常;而throws+异常类型比较消极,发现异常后并不解决异常,而是告诉别人此处存在异常,也就是仅抛出异常,交给别人解决。
Java异常处理机制_第5张图片

1.4.1 抓抛模型

  • “抛出”:程序正常执行过程中一旦出现异常,就会在异常发生处生成一个对应类型的异常对象,并将此对象抛给调用者处理。一旦抛出异常对象后,该异常代码处以后的代码均不执行。
  • “抓住”:进行异常处理: 2)try-catch-finally结构;2)throws+异常类型;

Java异常处理机制_第6张图片

1.4.2 方式一: try-catch-finally

  • 使用try-catch-finally结构对编译时异常进行处理,相当于将一个编译时异常延迟到运行时出现;
  • 开发中通常只对编译时异常进行处理,而运行时异常则无需专门处理;
        try {
            //可能发生异常的代码
        }catch (异常类型1 异常对象e){
            // 异常处理
            // 处理方式:
//            e.printStackTrace();
//            String message=e.getMessage();
        }catch (异常类型2 异常对象e){
            // 异常处理
        }catch (异常类型2 异常对象e){
            // 异常处理
        }
        ...
        finally{
            // 一定会执行的代码
        }

try-catch结构:

  • try内部为可能发生异常的代码;
  • catch内部对捕捉到的异常进行处理;
  • try中代码一旦发生异常,则在代码异常处生成异常对象,根据异常类型在catch中匹配对应类型的处理;
  • 一旦异常发生则会进入唯一匹配的catch结构进行异常处理,因此try结构中异常代码后的代码将不会执行,当catch结构代码执行完毕,则进入finally结构进行代码执行,然后依次执行try-catch-finally结构后的所有代码;
  • catch结构可以有多个,但其中需要注意:如果有不同的catch结构中的异常类型存在继承关系,则子类异常必须声明在前;
  • catch结构中常用异常处理方式:1)e.printStackTrace;2)String e.getMessage();
  • try结构中声明的变量一旦出了try结构,就无法再使用;
  • try-catch-finally结构可以嵌套使用;

try-catch-finally:

  • finally可选,无论是否发生异常,均会执行其内部代码;
  • 无论try中有return语句,还是catch中有未处理的异常或return语句情况下,finally结构均会执行,且finally结构会在try-catch结构结束之前执行完毕;
  • finally中一般用于关闭资源,如Socket、IO流、数据库连接等资源;

1.4.3 方式二:throws+异常类型

  • 代码体现在方法声明处,可同时抛出多个异常类型;
  • 此方式只是将异常交给上层调用者,并未真正解决异常。一旦发生异常,代码异常处生成对应类型的异常对象,并抛出;
  • 异常代码之后的代码不再执行;
  • 方法重写时,子类方法抛出的异常类型小于等于父类中方法抛出的异常类型(多态导致);

1.4.4 两种方式如何选择

  1. 如果父类方法中没有使用throws处理异常,则子类方法重写时只能使用try-catch-finally结构处理异常;
  2. 如果在执行方法a中,依次调用了多个方法,而这些方法具有递进方法,则一般这些方法的异常使用throws进行处理,在方法a中使用try-catch-finally结构处理异常;

1.5 手动抛出异常throw

  • 之前使用try-catch-finally结构或者throws结构处理异常时,异常对象由系统内部自动生成,这两种处理方式是去捕获异常对象进行处理;
  • throw用于手动生成异常对象并抛出;
  • 一般使用throw抛出Exception对象或RuntimeException对象;
  • 使用方式:throw new XXXException(异常信息);

throw和throws的区别:
throw用于生成异常对象并抛出异常对象;而throws+异常类型是去捕获异常对象,并向上层调用者抛出,是一种异常处理方式。

1.6 自定义异常类

自定义异常类步骤:

  1. 自定义类继承现有的异常类,比如Exception、RuntimeException;
  2. 提供全局常量serialVersionUID,用于序列化标识;
  3. 重写需要的构造器;

Java异常处理机制_第7张图片

资料来源:尚硅谷

你可能感兴趣的:(Java开发,java,jvm,开发语言)