Java基础--异常

异常
  • 常见异常有:
  1. ArrayIndexOutofBoundsException 数组下标越界异常
  2. NullPointerException 空指针异常
  3. StringIndexOutofBoundsException 字符串下标越界异常

在这里插入图片描述

  1. ArithmeticException 算数异常

在这里插入图片描述

  1. ClassCastException 类型转换异常

Student student; // null

student.getId();

student.name;


在这里插入图片描述

这里的Throwable是类,大部分以able结尾的一般都是接口,able在英语里面就是表达能不能意思。接口表示能不能具有某个功能。

public class Throwable

一图胜千文

在这里插入图片描述

异常:就是程序运行时侯出现不正常情况。

异常的由来:Java是纯面向对象的语言,异常就是Java用面向对象的思想将不正常的情况进行了封装。

如果访问了数组不存在的下标,java就把这个错误信息封装到ArrayIndexOutofBoundsException这个类里面。

所有的异常都继承自Runnable接口。

异常的分类:

Error:非常严重的错误,联想到人就是得了不治之症。一般很少见,也很难通过程序解决。它可能源于程序的bug,但一般更可能源于环境问题,如内存耗尽。错误在程序中无须处理,而有运行环境处理。

Exception:并不是非常严重的错误,联想到人得了感冒这种疾病,通过吃药可以治疗。


编译时异常(非运行时异常你在写代码的时候就需要处理的异常):程序正确,但因为外在的环境条件不满足而引发。例如,这不是程序本身的逻辑错误Java编译器强制要求必须处理这类异常,如果不去处理这个异常,程序就会报错。(读取一个硬盘上的图片,读取代的代码逻辑是正确的,但是这个图片所在的硬盘可能出现坏道,就没法读取这个文件,未雨绸缪提前检测可能会有读取硬盘问题)

运行时异常(RuntimeException代码运行时候抛出的异常):这意味着程序存在bug,如数组越界,0被除,空指针…这类异常需要改进程序来避免,Java编译器强制要求处理这类异常。如果抛出运行时异常,是要根据抛出的异常的信息去分析程序的错误,在写代码的时候大部分情况下不去try—catch运行时异常。

自定义异常:

继承Exception都是编译时异常。

继承自RuntimeException是运行时异常。


异常的处理:

try {
     // 需要检查的代码(可能会抛出异常,也可能不会抛出异常)
} catch(/*异常的类型   异常类型的变量*/) {
    // 捕获异常后要处理异常
} finally {
    // 一定会被执行的代码(不管异常抛不抛出都会执行)
}

编译时异常(非运行时异常、检查时异常)

编译时异常在写代码的时候必须要处理这个异常,不处理就报错。

处理的方法有两种:

  1. try-catch捕获这个异常,自己处理了这个异常
  2. throws抛出异常,我不处理这个异常,抛出异常

多重捕获快(多个catch)

try {
    // 需要检测的代码(可能会抛出异常,也可能不会抛出异常)
} catch (/*异常的类型1 异常类型的变量1*/) {
     // 捕获异常后处理异常
} catch (/*异常的类型2 异常类型的变量2*/) {
     // 捕获异常后处理异常
} catch (/*异常的类型3 异常类型的变量3*/) {
     // 捕获异常后处理异常
} finally {
     // 一定会被执行的代码(不管异常抛不抛出都会执行,例如数据库释放连接)
}


throws、throw

在这里插入图片描述


自定义异常:

  1. 所有的异常都是Throwable的子类
  2. 如果写一个运行时异常,需要继承RuntimeException
  3. 如果要写一个编译时异常,继承Exception

未雨绸缪,提前检查


在这里插入图片描述


对于运行时异常选择提前判断而不是用try catch捕获,图中文字描述应该为运行时异常(打错了!!)
在这里插入图片描述


案例:模拟银行转账,可以实现存钱和取钱的功能

取钱的时候如果余额不够就抛出异常MeiQianException

//账户管理
public class AccountManager {

    //余额
    private Double balance;
    public AccountManager(Double balance) {
        this.balance = balance;
    }

    //存钱
    public void deposit(Double money) {
        balance += money;
    }

    //取钱
    public void withdraw(Double money) throws MeiQianException {
        if (balance >= money) {
            balance -= money;
        } else {
            //余额不足
            double needMoney = money - balance;
            throw new MeiQianException("余额不足还差:" + needMoney);
        }
    }
}
//自定义异常
public class MeiQianException extends Exception{

    //这个message为抛出这个异常的时候打印的信息
    public MeiQianException(String message) {
        super(message);
    }
}
//测试
public class ExceptionTest {
    public static void main(String[] args) {
        AccountManager accountManager = new AccountManager(1000.0);
        accountManager.deposit(500.0);
        try {
            accountManager.withdraw(1600.0);
        } catch (MeiQianException e) {
            e.printStackTrace();
        } finally {
            System.out.println("finally");
        }
    }
}

在这里插入图片描述

不管捕不捕获异常,最终的finally里面的代码都会被执行。例如将1600.0换成1400.0,由于此时余额有1500.0,1500.0>1400.0,所以此时不会抛出异常,但是最终的finally都会被执行,结果如图:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值