Java 异常处理

305 阅读4分钟

「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」。

最近有点忙算法之后会给大家补,最近可能会新开两个专题,一个是Java IO,另一个是Hexo+云服务器搭建个人博客,我会尽快给大家更完

异常处理

常见异常

在Java中,异常(错误)分为两大块:Error错误Exception错误,并且他们都在Java.lang.Throwable

异常处理类图

Error严重错误

​ Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。

Exception

该错误则表示为“一般性的错误问题”可以在Java程序中通过代码解决,也就是说,我们说到的Java中的“异常处理”就是解决Exception错误(异常)

同时Exception异常又可以划分为两类: ①Javac.exe的异常——编译时异常(在编译器中一般会提示)

②Java.exe的异常——运行时异常(会在控制台提示:RuntimeException)

处理异常

在Java中提供了一种异常处理的机制——抓抛模型,用来预防可能出现异常的代码并解决出现的异常。

抓抛模型

“抓”的格式中一般为try—catch—finally;

try{
        //可能出现异常的代码;
    }
    catch(Exception e)//异常类型1,其中Exception为出现异常所得到的提示;
    {
        //处理方式
    }
    catch(Exception e)//异常类型2,e可以同名,类似与局部变量;
    {
        //处理方式
    }
    finally{
        //可选,不管有无异常或异常是否处理都会执行;
    }
特点
  • try内的变量类似于局部变量,错误处理的时候尽量避免包含原有的变量或者完整包含可能出现异常的地方;

  • finally是可选项目,里面的内容一定会执行并且会在在错误处理执行前执行,一般用于对资源的释放;

  • catch语句内部是对异常的处理,而用户可以自定义操作的内容,同时,java也提供了三个方法:

    catch(Exception e)//异常类型2;e可以同名;catch可以有多个
        {
            e.getMessage();//获得错误信息;
            
            e.toString();//获得异常的种类和错误信息;
            
            e.printStackTrace();//在控制台打印异常种类、错误信息与出错的位置;
        }
    

原理:当一个异常自己(本层)处理了的时候,利用一种方法将异常以及异常的类型 抛给调用者,由调用者解决;

public class Hello {
    public static void main(String[] args){
          Solve1();//调用Solve1方法;
    }

    public static void Solve1(){//为了简化实例化对象过程,将方法都设置为static;
        try {
            //1.调用Solve2方法;
            Solve2();
            //4.得到Solve2()中反馈回来的异常及异常类型;

        }catch (ArrayIndexOutOfBoundsException a){//5.进行对应的异常处理;
            System.out.println("数组越界啦!!");
        }
    }

    public static void Solve2() throws ArrayIndexOutOfBoundsException{// 3.将异常和异常类型传到调用该方法的方法Solve1()中;

        int[] a=new int[10];
        System.out.println(a[11]);//2.出现数组越界的异常,但是本方法中没有解决的方法
    }
}

特点

1.可以使用这样的方法(throws)将错误逐个向上抛出;

2.也可以在某一层中(或自己),用try-catch-finally进行处理;

异常类与自定义异常类

打开原有的异常类,查看里面的格式:

说一个点,IEDA中打开源码的方法:
1.选中要打开的对象;
2.Ctrl + Shift+i;
3.Ctrl + Enter;(继续第二步)
4.也可以直接快捷:Ctrl+鼠标左键;

自定义异常类:

/**
 * @author 人生若只如初见
 * @creatTime 2021--24 19:26
 */
public class InsufficientFundException extends Exception{
    InsufficientFundException(String massage){
        super(massage);
    }
}
/**
 * @author 人生若只如初见
 * @creatTime 2021--24 19:14
 */
public class Account {
    String name;
    double balance;

    public Account(String name, double balance) {
        this.name = name;
        this.balance = balance;
    }
    //存钱
    public void deposit(double money){
        this.balance+=money;
        System.out.println("余额:"+balance);
    }
    //取钱
    public void withdraw(double amount){
        try{
            if(amount>balance){
                throw new InsufficientFundException("余额不足");
            }
            else{
                balance=balance-amount;
                System.out.println("余额:"+balance);
            }
        }catch (InsufficientFundException e){
            //此种方法新建了一个运行时异常,将自定义异常赋了进去
            //RuntimeException runtimeException = new RuntimeException(e);
            //throw runtimeException;
            //此种方法是打印自定义异常的异常信息,异常栈信息
            //System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Account account = new Account("Jeckie",10000);
        account.deposit(100);
        account.withdraw(10000);
        account.withdraw(1000);
    }
}