根类 throwable 下面有两个子类 error 错误 错误是无法通过处理的 exception 异常
异常的分类 编译时异常 运行时异常 编译阶段就会报错 就是写代码的时候就出现问题 运行时异常 写代码时不报错 运行时才报错 继承自runtimrException的都是运行时异常 其他都是编译时异常 编译时异常是担心程序员技术不行 在编译阶段就爆出一个错误用于提醒 可遇不可求 遇到了就抛出
异常抛出过程: 在某一行出现了运行时异常 会在此处创建一个异常对象AirthemticException 首先把异常送到方法入口 再送到调用的地方 再送到main方法 再交给 JVM 虚拟机接收到异常以后 现在控制台直接输出异常栈信息 然后直接从当前执行的异常点干掉程序 后续代码没有机会运行
编译时异常抛出的方式 throw exception 直接抛大类 有异常就往上抛 都不负责任 这种方式不太好 一旦运行出现异常 他还是会让后面的代码停止运行 程序死亡
方式二 出现异常的地方直接处理 谁出异常谁处理 try catch 在catch内打印异常栈信息 可以不用写多个catch 可以多个异常在一个catch的入口并列 企业级写法是 在catch内直接写 exception 拦截所有异常 但是方式二也有一点问题 就是上层不知道程序到底是成功还是失败 我让马少聪去买瓜 他可能一去不复返 但是我不知道情况
第三种 就是throw 跟try catch联合 底层出现的问题 交给上层集中处理 内部用throw 外部用try catch 这样就很清晰 而且程序出现异常后也不会立即死亡
编译时异常是被迫的 运行时异常是可选择的 运行时异常的处理规范 直接最外层捕获处理即可 底层会自动跑出
throw与try catch的区别 throws是往上抛 都不负责 catch是直接在这里处理 并且打印出异常栈信息
flnally 最多一次 可有可无 无论异常还是正常 他一定会运行 收尾代码 回收资源 清扫资源 例子 用于输入输出流的关闭 因为前面的代码可能导致异常 那么在t ry里面io流无法关闭 只能用finally来关闭了 什么是资源? 自带了closeable接口 可以使用close方法的就是资源 不建议在finally中写return 因为他会覆盖前面所有的return值
自定义异常 我们可以描述公司的某种问题是一种异常 那么我们需要自己继承exception类来写一个自定义异常类 例子 年龄不能小于0或者大于两百 我们先继承exception类创建AgeIllegaException 重写父类方法 后 throws代表向上抛异常 而throw new代表 new一个异常对象
因为方法里抛出了编译时异常 那么就会在异常发生的地方 打印出异常原因 你觉得这个异常严重 就定义成编译时异常 你觉得这个异常不严重 就定义成运行时异常
异常的作用 案例
lamada表达式的作用 简化匿名内部类 只能简化只有一个抽象方法的匿名内部类写法 @FunctionalInterface 只要接口上加上了这个注解 就代表可以用lamada表达式重写 案例一简化Thread类
案例二简化comparator
方法引用的简化 静态方法的引用 实例方法的引用 特定类型方法引用 构造器引用 数组里面也可以接比较器
Stream流可以解决什么问题? 可以解决已有集合或者一些数组的弊端 可以把某个集合变成水流一样 可以链式编程
流就像是一根传送带 在传送过程中对其可以做各种操作
map集合可以拿键流或者拿值流 或者键值对流