JavaSE之第十一章异常处理

第十一章 异常处理

常见异常:
ArrayIndexOutofBoundsException 数组下标越界异常
NullPointerException 空指针异常
StringIndexOutofBoundsException 字符串下标越界异常
ArithmeticException 算数异常
ClassCastException 类型转换异常

Student student; // null
student.getId();
student.name;

异常:就是程序运行时候出现不正常情况。
异常的由来:Java是纯面向对象语言,异常就是Java用面向对象的思想将不正常的情况进行了封装。
如果访问了数组不存在的下标,java就把这个错误信息封装到ArrayIndexOutOfBoundsException这个类里面。
所有的异常都继承自Runnable接口。

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

public classThrowable 不是接口

11.1 程序中的问题

1)语法错误
代码没有按照Java规定语法编写
这种代码是不能通过编译的,在eclipse中会将出错的地方是用红色波浪线标记
解决方式:修改代码中不符合语法的地方
2)运行时错误
程序可以通过编译,也可以执行,执行时,控制台中会出现红色的异常信息
例如:空指针异常,数组下标越界
解决方式:
3)逻辑错误
程序可以通过编译,也可以运行,也可以执行完成,但是得到的结果不对
算法有问题
解决方式:
重新验证算法的正确性,
算法实现过程是否正确
调试

11.2 运行时的错误

当程序运行过程中,数据或操作不当,程序就会抛出错误
这些错误 都是Throwable类的对象
Throwable类
Java中所有错误类的父类
有两个子类
Error类
错误,一般来说是JVM内部的问题
比如:栈溢出错误
在我们的代码中解决不了,
只能从代码设计中避免出现这样的问题
Exception类
异常,主要是代码设计上的缺陷
子类RuntimeException类,它是所有运行时异常的父类

11.3 异常的分类

Image.png

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

1)运行时异常 都是继承RuntimeException类,不需要强制进行处理
可以不处理
空指针异常
数组越界
字符串越界
算术运算异常
输入不匹配
类型转换异常
迭代修改异常
运行期异常(RuntimeException,代码运行时候抛出的异常 ): 这意味着程序存在bug,如数组越界,0被除,空指针…这类异常需要更改程序来避免,Java编译器强制要求处理这类异。如果抛出运行时异常,是要根据抛出的异常的信息去分析程序的错误,在写代码时候绝大部分情况下不去try-catch运行时异常。

2)编译时异常
都不是RuntimeException类的子类,这些异常必须通过处理才能编译通过
解析异常
不支持克隆异常
编译时异常(非运行时异常,你在写代码时候就需要处理的异常):程序正确,但因为外在的环境条件不满足引发。例如:这不是程序本身的逻辑错误,Java编译器强制要求必须处理这类异常,如果不去处理这个异常,程序就会报错。(读取一个硬盘上图片,读取的代码逻辑是正确的,但是这个图片所在的硬盘可能出现坏道,就没法读取这个文件,未雨绸缪提前检测可能会有读取硬盘问题)
编译时异常(非运行时异常、检查时异常)
编译时异常在写代码时候必须要处理这个异常,不处理就报错。
处理的方法有两种:
1、try-catch捕获这个异常,自己处理了这个异常
2、throws抛出异常,我不处理这个异常,抛出异常

自定义异常:
继承Exception都是编译时异常。
继承自RuntimeException运行时异常。

11.4 异常的处理方式

11.4.1 try catch 捕获异常

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

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

运行过程

  1. 进入try后面的代码块执行
  2. 当不出现异常时,执行完try里的代码,执行finally中的代码
  3. 当出现异常时,try里的代码不再执行,而是跳到catch去执行

11.4.2 throws抛出异常

throws、throw
语法结构:
修饰符 返回值类型 方法名(参数列表)throws 异常类型1,异常类型2{
可能出现异常的代码
}

当方法中出现相应异常时,把异常抛给调用方法的地方

11.5 自定义异常

自定义异常:
继承Exception都是编译时异常。
继承自RuntimeException运行时异常

11.5.1 定义异常

只需要继承Exception/RuntimeException类

11.5.2 生产异常

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

案例:模拟银行转账,可以实现存钱和取钱的功能
取钱时候如果余额不够就抛出异常 MeiQianException

/**
* 1、所有的异常的都是Throwable的子类
* 2、如果写一个运行时异常,需要继承RuntimeException
* 3、如果要写一个编译时异常,继承Exception
* 未雨绸缪,提前检查
*/
public class MeiQianException extends Exception {
    //这个message
    public MeiQianException(String message) {
        super(message);
    }
}
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);
        }
    }
}
@Test
    public static void main(String[] args) {
        AccountManager accountManager = new AccountManager(1000.0);
        accountManager.deposit(500.0);
        try {
            accountManager.withdraw(1000.0);
        } catch (MeiQianException e) {
            e.printStackTrace();
        }
    }

throw throws
image.png

11.6 异常信息

Exception类的方法
getMessage():获取这个异常的信息
printStackTrace():打印栈的跟踪信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值