异常

异常

本章目标

  • 了解异常的分类

  • 了解异常捕获的分类

  • 重点掌握异常处理和声明的规则

  • 掌握如何编写自定义异常


什么是异常

异常就是在计算机程序运行的过程中,出现的各种各样错误

Java 异常类

异常类是 Java 中专门用来描述不同的异常情况的一些类,所有异常类组成了 Java 的异常类庞大的继承树体系

image-20210731171002542

Exception 类

运行时异常类(RuntimeException)
  • Nullpointer Exception:空指针异常

  • ClassCastException:类型强制转换异

  • IllegalArgumentException:传递非法参数异

  • IndexOutOfBoundsException:下标越界异常

  • NumberFormatException:数字格式异常

  • ArrayIndexOutOfBoundsException: 数组越界异常

  • ArrayStoreException: 数组类型不一致异常

  • ArithmeticException: 算术异常(除 0 异常)

  • BufferOverflowException: 缓冲区溢出异常

非运行时异常类(CheckedException)
  • ClassNotFoundException:找不到指定 class 异常

  • IOException:IO 操作异常

  • FileNotFoundException:文件不存在异常

  • SQLException:SQL 语句异常

  • InterruptedException: 中断异常

异常处理机制

异常处理机制是 Java 语言中的一种机制,是 Java 语法的一个特色功能,通过恰当的使用该机制,可以使得 Java 语言编写的程序更加稳定

抛出异常(Throw Exception)

Java 程序在执行过程中如果出现异常,会自动实例化相应的异常类对象,该异常对象将被自动提交给 JVM,这一过程称为抛出异常

Java 可以使用 throw 和 throws 两种方式抛出异常

throw 用于在代码中抛出异常

语法格式

throw new 异常类型;

举例

void method ( String str ) {
    if  ( str == null )  {
        throw new NullPointerException();
    }
}
throws 用于在方法中抛出异常

语法格式

方法名() throws 异常类型  {
      //方法体
}

举例

void method ( String str )  throws NullPointerException   {
         …
}
捕获异常(Catch Exception)

当 JVM 接收到抛出的异常对象时,会寻找能处理这一异常的代码,并把当前异常对象交给其处理,这一过程称为捕获异常(如果 JVM 找不到可以捕获异常的代码,则 Java 程序将异常退出)

语法格式

try {
     //代码段(可能发现异常的代码)
} catch (异常类型1 exception) {
    //对异常进行处理的代码段
} catch (异常类型2 exception2) {
    //对异常进行处理的代码段
} catch (异常类型3 exception3) {
    //对异常进行处理的代码段
} catch (异常类型n exceptionN) {
    //对异常进行处理的代码段
} finall { 
  //无论是否有异常,始终会被执行的代码
}

异常处理控制流程

  • 当有异常发生时,代码控制流程转到执行 catch 中的异常处理代码,执行完毕后继续执行 catch 后的代码

  • 当没有异常发生时,不会执行 catch 中的异常处理代码

  • 一段代码可能会引发多种类型的异常,当引发异常时,会按顺序来查看每个 catch 的异常类型,并只执行第一个与异常类型匹配的 catch 中的异常处理代码,其他的 catch 中的异常处理代码将不会执行

  • 在排列 catch 的顺序时,首先应该将捕获子类异常类型放在前面,然后是捕获父类异常类型

异常传播

当某个方法抛出异常时,如果当前方法没有捕获异常,异常就会被抛到上层调用方法,直到遇到某个 try ... catch 被捕获为止

printStackTrace( ) 方法:可以打印出方法的调用栈,对于调试错误非常有用(每层方法调用均给出了源代码的行号,可直接定位产生异常的代码位置)

自定义异常

自定义异常类推荐继承 RuntimeException 异常类

举例

public class MyException extends RuntimeException {
    public MyException() {
        super();
    }
    
    public MyException(String msg) {
        super(msg);
    }
    
    public MyException(String msg, Throwable cause) {
        super(msg,cause);
    }
}

自定义异常的使用

void method ( String str ) {
     //代码中抛出自定义异常类
     throw new MyException();
}
​
void method ( String str ) throws MyException {//方法中抛出自定义异常类
     … 
}

异常处理机制的特点

  • 通过异常传播可以将异常对象传递到合适的位置再处理,使得 Java 语言的异常处理更加灵活

  • 可以在源代码级别将正常执行的逻辑代码和异常处理的代码相分离,更加便于代码阅读和维护

  • 过度使用异常处理将降低程序的执行效率,增加语法的复杂度

练习题

class TestDemo {
    public static void main(String[] args) {
        System.out.println(test());
    }
   public static int test() {
        int a = 2;
        try {
            System.out.println("try代码块return前");
            return a;
        } finally {
            a = 3;// 修改a变量的值
            System.out.println("finally 代码块");
        }
    }
}

结果

try代码块return前

finally 代码块

2

总结:finally中有return时会覆盖try里面的return,异常代码尽量不要写这种代码,可读性会变得很差

posted @ 2021-08-24 19:45  嘛了对就念来过倒  阅读(199)  评论(0编辑  收藏  举报