第九章、异常

68 阅读2分钟

1、异常初步

1.1 介绍

程序很可能出现问题,而我们希望程序可以继续执行下去,就需要使用异常处理机制。看一个例子。

public class Beginner {
    public static void main(String[] args) {
        //int n1 = 4;
        //int n2 = 0;
        //System.out.println(n1/n2);  //这行报错,不能继续往下执行
        //System.out.println("执行完毕");

        int num1 = 10;
        int num2 = 0;
        try {
            System.out.println(num1/num2);
        } catch (Exception e) {
            System.out.println("继续执行");
        }
    }
}

基本概念:Java语言中,对程序执行中发生的不正常现象叫做异常。

1.2 分类

  • 异常Exception:代码级别的问题,可以被捕获并进行相应的处理。比如栈溢出StackOverFlow、堆内存溢出OutOfMemory
  • 错误Error:JVM级别的严重错误,出现Error会让程序进入不可恢复的状态。

在这里插入图片描述

运行时异常,也叫做非受检异常(unCheckedException),有的运行时异常可以不做处理,比较普遍,所以可以暂不处理。

  • NullPointerException 空指针异常
  • ArithmeticException 数学运算异常
  • ArrayIndexOutOfBoundsException 数组下标越界异常
  • ClassCastException 类型转换异常
  • NumberFormatException 数字格式不正确异常
  • 等等

编译时异常,受检异常(CheckedException),必须要在编译前处理的异常。

  • SQLException:操作数据库的异常
  • IOException:文件操作出现的异常
  • FileNotFoundException:文件未找到异常,一般用于IO流
  • ClassNotFoundException:类未找到异常
  • IllegalArgumentException:参数异常

2、异常处理的方式

两种:

  • throws:抛给上级

  • try...catch...finally:在本级捕获处理

注意:一般catch(异常)时,如果有多级异常,一般要求子类在前,父类在后。

//这样就报错了
public static void main(String[] args) {
    try{
        int i = 10/0;
    }catch (Exception e){
        e.printStackTrace();
    }catch (RuntimeException e){
        e.printStackTrace();
    }
}
复制代码

编译时异常,程序必须处理,运行时异常,如果不处理就是throws异常。

子类重写父类方法时,对父类型抛出的异常的规定:子类型重写方法,所抛出的异常类型要么和父类抛出的异常一致,要么是父类抛出异常的子类型。

throw和throws:

image.png

3、自定义异常

让自己定义的类去继承Exception或RuntimeException类。

  • 继承Exception类的是编译时异常
  • 继承RuntimeException类的是运行时异常

定义一个异常:

public class SelfDefinitionException extends Exception{
    public SelfDefinitionException(String message) {//构造器
        super(message);
    }
}
复制代码

测试:

public class SelfDefinitionExceptionTest {
    public static void main(String[] args) {
        int i = 0;
        if (i == 0){
            try {
                throw new SelfDefinitionException("该数不能等于0");
            } catch (SelfDefinitionException e) {
                e.printStackTrace();
            }
        }
    }
}