1.什么是异常

程序运行时,发生了不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。
异常错误的原因:可能是JVM的原因,也有可能是程序本身的原因

2.常见的异常

  • 检查性异常
  • 运行异常
  • 错误(error): 错误不是异常,而是脱离了程序员控制的问题

3.用什么来处理这些异常

java有异常处理的机制,可以把所有的异常当做对象来处理
java异常处理的几个关键字:
trycatchfinallythrowthrows

  • try -- 用于监控异常的区域
  • catch -- 捕获程序中的异常
  • finally -- 处理善后的工作(可以要finally,也可以不要finally,主要作用是关闭一些IO及数据库连接的资源)
  • throw -- 用于抛出异常
  • throws -- 主动抛出异常,一般在方法中使用,用于声明该方法可能会抛出异常

4.详细示例

4.1 捕获异常

代码

package exception.demo01;

public class Demo02 {

    public static void main(String[] args) {

        int a = 3;
        int b = 0;

        System.out.println(a / b);
    }
}

运行结果

从运行结果来看,程序出现了ArithmeticException异常
为了解决这个异常,我们可以使用try-catch来捕获该异常

代码如下所示

package exception.demo01;

public class Demo02 {

    public static void main(String[] args) {

        int a = 3;
        int b = 0;
        try {
            System.out.println(a / b);
        }catch (ArithmeticException e) { //catch中参数说明 想要捕获的异常类型
            System.out.println("捕获异常,被除数不可以为0");
        }finally { //处理善后的工作,如关闭数据流的操作
            System.out.println("程序结束");
        }
    }
}

异常处理后的结果

4.2 捕获错误

有时,我们写程序的时候,由于自己的疏忽,导致程序出错了,这时就会出现一个严重的错误
如果这个错误不解决,就会导致我们程序的提前终止
为了解决这个问题,我们也可以将错误捕获起来

如下面代码所示

package exception.demo01;

public class Demo02 {

    public static void main(String[] args) {
        new Demo02().a();
    }

    public void a(){
        b();
    }

    public void b(){
        a();
    }
}

运行结果

我们发现程序出现了错误 StackOverflowError

这时我们捕获程序错误就不能通过捕获异常的方式去捕获,我们需要一个最大的父类去捕获这个错误

代码如下所示

package exception.demo01;

public class Demo02 {

    public static void main(String[] args) {

        try {
            new Demo02().a();
        }catch (Throwable t) { // 这时一个最大的父类,其中包含了error和异常
            System.out.println("出现了栈溢出的错误");
        }
    }

    public void a(){
        b();
    }

    public void b(){
        a();
    }
}

运行结果如图所示

4.3 对于多个异常的捕获

/**
 * 如果要捕获多个异常 可以使用多个catch块
 * 注意 最大的异常应该放在最后,不然小异常捕获不到
 */
try {
  new Test().a();
}catch (Error e){
  System.out.println("Error");
}catch (Exception e){
  System.out.println("Exception");
}catch (Throwable t){
  System.out.println("Throwable");
}

4.4 通过throw抛出异常

package exception.demo01;

public class Test2 {

    public static void main(String[] args) {
        int a = 1;
        int b = 0;

        try {
            if (b == 0){ // 主动的抛出异常 throw throws
                // 主动抛出异常,一般在方法中使用
                throw new ArithmeticException();
            }
        } catch (Exception e) {
            // 增加一些处理异常的代码
            e.printStackTrace(); // 打印错误的栈信息
        }
    }
}

执行结果

4.5 自定义异常

首先创建一个MyException.java的异常类,继承Exception

package exception.demo01;

/**
 * 创建一个自定义的异常类
 */
public class MyException extends Exception{

    private int detail;

    public MyException(int a){
        this.detail = a;
    }

    //toString:异常信息的打印
    @Override
    public String toString() {
        return "MyException{" +
                "detail=" + detail +
                '}';
    }
}

编写测试类(没有异常的情况)

package exception.demo01;

public class Test3 {

    //可能会存在异常的方法
    static void test(int a) throws MyException{

        if (a > 10){
            throw new MyException(a);
        }
        System.out.println("OK!");
    }

    public static void main(String[] args) {
        try {
            test(1); // 1 < 10 不会出现异常
        } catch (MyException e) {
            System.out.println("MyException=>" + e);
        }
    }
}

编写测试类(有异常的情况)

package exception.demo01;

public class Test3 {

    //可能会存在异常的方法
    static void test(int a) throws MyException{

        if (a > 10){
            throw new MyException(a);
        }
        System.out.println("OK!");
    }

    public static void main(String[] args) {
        try {
            test(11); // 11 > 10 会出现异常
        } catch (MyException e) {
            System.out.println("MyException=>" + e);
        }
    }
}

最后修改:2021 年 02 月 15 日
如果觉得我的文章对你有用,请随意赞赏