今天结束了javase的最后阶段,上节课剩余的异常的finally以及处理流程,还有常用工具类的介绍。
一.finally
不管是否发生异常,finally里的代码一定会被执行
一般finally里执行的是善后的操作或一些资源清理的扫尾工作
补充:
try-catch中,try后可写小括号(可把finally合并起来)
如:
try {
return 10;
}finally {
return 20;
}
⇒ 返回的是20,即使遇到return了,finally也还是会执行
虽然可以运行,但工作中最好不要在finally中写return语句
异常的处理流程
如果有多个异常报错,应该先看第一行的,这才是根本原因
⇒ 异常信息调用栈,建议从上往下排除异常
如果向上一直传递都没有合适的方法处理异常,最终就会交给JVM处理,程序就会异常终止
流程总结
1. 程序先执行try中的代码
2. 如果try中的代码出现异常,就会结束try中的代码,看和catch中的异常类型是否匹配
3. 如果找到匹配的异常类型,就会执行catch中的代码
4. 如果没有找到匹配的异常类型,就会将异常向上传递到上层调用者
5. 无论是否找到匹配的异常类型,finally中的代码都会被执行到(在该方法结束之前执行)
6. 如果上层调用者也没有处理的了异常,就继续向上传递
7. 一直到main方法也没有合适的代码处理异常,就会交给JVM处理,此时程序就会异常终止
二.自定义异常类
要继承Exception这个类 — 默认自定义的异常类是一个受查异常/编译异常
要继承RuntimeException这个类 — 此时这个异常类是非受查异常/运行异常
⇒ 运行异常一般是代码写错:参数传错、空指针、输入错、越界、类型转换错误等
编译异常一般是外部环境问题:文件不存在、网络断开、IO失败等
三.常用工具类介绍
1、日期相关类
(1) Date类
早期用于表示日期和时间的类,位于java.util包中
Date date = new Date(123,2,5);
① Date默认的时间是1900年起计算的 → 实际是1900+123=2023,用来确定年份
② 2代表3月,0代表1月,实际输出为3月
③ 代表实际的日期
(2) LocalDateTime类
创建对象时,直接实例化不行,有3种方式
① LocalDateTime now = LocalDateTime.now();
② LocalDateTime now = LocalDateTime.of(创建指定日期)
③ LocalDateTime now = LocalDateTime.parse("2023-05-07T10:30:00"); 通过字符串创建指定日期
其常用方法:
① 获取当前日期 .now() 方法
② .getYear()
.getMonthValue()
.getDayOfMonth()
.getHour()
.getMinute()
.getSecond()
分别获取年月日时分秒
③ 创建指定日期 .of() 方法
④ 根据字符串创建日期
String date = "2026-10-01 10:30:21"
需要创建一个自定义的日期时间格式化器
DateTimeFormatter date1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
LocalDateTime date2 = LocalDateTime.parse(date, date1)
⑤ 日期运算
LocalDateTime date = LocalDateTime.now();
LocalDateTime datePlus = date.plusDays(1);
增加:plus
减少:minus
• .plusWeeks
• .plusMonths
• .plusYears
⑥ 根据当前时间获取指定时间
LocalDateTime date1 = date.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY))
当前所在周的周一/周天
.with(TemporalAdjusters.firstDayOfMonth())
.with(TemporalAdjusters.lastDayOfMonth())
当前所在月的第1天/最后1天
2、BigDecimal类
用来对超过16位有效位的数进行精确的运算
(1) 常用的构造方法
BigDecimal(int)/(double)/(long)/(string)
不建议,可能会丢失精度,更推荐用String去创建("2.99")
(2) 常用方法 — 加减乘
• .add() 加
• .subtract() 减
• .multiply() 乘
除法:①(抛出了异常,try-catch捕捉一下)
指定精度和舍入模式
BigDecimal □ = □.divide(□,4,RoundingMode.HALF_UP)
运算结果小数部分保留4位
HALF_UP:四舍五入(0.5向上舍入)
还有其他的舍入模式
②使用MathContext
□.divide(□, new MathContext(4,RoundingMode.HALF_UP))
适用于 财务计算(货币金额、利息计算)
科学测量(需要保留固定有效位数)
高精度工程计算(税率、费率、汇率换算)