各种常用API(二)和异常

day06

今日内容

  • JDK8以前的时间日期类
  • JDK8新的时间日期类
  • 异常

今日目标

  • JDK8以前的时间日期类【应用】
  • JDK8新的时间日期类【应用】
  • 异常【理解、应用】

01-时间日期类-概述

1 现实生活中的时间
  • 了解:世界标准时间:格林尼治标准时间(Greenwich Mean Time,GMT),现在用原子钟计算
- 英国格林威治(Greenwich)天文台原址子午仪中心的经线为本初子午线。	->	本初子午线
- 本初子午线	->	地球的0°经线
- 格林尼治标准时间(Greenwich Mean Time,GMT)
- GMT标准时间的正午是指当太阳横穿格林尼治子午线时的时间
- 地球经度从本初子午线向东180°(时间早于0°),向西180°(时间晚于0°),一共360°

- 时区(Time Zone):
	- 地球自转一天是24小时,按经度分为24个时区;360°÷24=15°(每15°一个时区)
	- 由于地球自转的不规则,时间不准确,所以使用原子钟计算出来的时间作为标准时间
  • 了解:中国标准时间=世界标准时间+8小时
北京所在时区为东八区,中国标准时间整体采用北京时间
  • 问题:现实生活中【秒级别】的单位有哪些?这些单位之间如何换算?
1秒=1000毫秒
1毫秒=1000微秒
1微秒=1000纳秒
2 计算机中的时间
  • 问题:计算机中的时间原点?
1970年1月1日 0时0分0秒
  • 问题:System.currentTimeMillis();获取的毫秒数是什么?
从计算机时间原点到当前【系统】时间的毫秒值

02-时间日期类-Date构造方法

注意:java.util.Date

  • 问题:两个构造方法的【作用】?
public Date() // 用系统当前时间构造Date对象
public Date(long date)// 用指定时间的毫秒值构造Date对象,时差
  • 扩展:Date对象表示的日期时间,有时差、Date对象空参构造
1.时差	
系统当前的时区
2.Date类的空参构造
public Date() {
	this(System.currentTimeMillis());
}

03-时间日期类-Date成员方法

  • 问题:两个成员方法有什么【作用】?
public long getTime() // 获取毫秒值
public void setTime(long time) // 用参数指定的毫秒值修改当前对象

04-时间日期类-SimpleDateFormat

  • 问题:SimpleDateFormat有参构造,传入字符串中的字母分别代表什么意思?
有参构造:public SimpleDateFormat(String pattern)
参数:"yyyy-MM-dd HH:mm:ss"
// 其他没介绍的不常用的 可以查API
【格式】:除了字母都可以替换
  • 问题:SimpleDateFormat两个成员方法都有什么【作用】?调用parse方法解析时,有什么注意事项?
public final String format(Date date) // 格式化(日期对象 -> 字符串)【格式】
public Date parse(String source)// 解析(字符串 -> 日期对象)【格式】

注意事项:
解析时,如果格式不匹配,会抛异常
  • SimpleDateFormat的使用
1.创建对象
// 拿到这个格式
2.两个成员方法
格式化(日期对象 -> 字符串)【格式】
解析(字符串 -> 日期对象)【格式】

05-时间日期类-练习

  • 练习
秒杀开始时间2020年11月11日 00:00:00
秒杀结束时间2020年11月11日 00:10:00

小贾同学下单时间2020年11月11日 00:03:47
小皮同学下单时间2020年11月11日 00:10:11

需求:用代码判断小贾和小皮 谁参加到了活动

考察:毫秒、Date类、SimpleDateFormat类

思路:
	- 将字符串转换成Date类型:SimpleDateFormat
	- 获取Date类型的毫秒值
	- 用毫秒值进行大小比较
  • 小结:Date类、毫秒值、SimpleDateFormat类
毫秒值 -> Date对象
	1.new Date(毫秒值)
	2.date.setTime(毫秒值)
Date对象 -> 毫秒值
	date.getTime();

Date对象 -> 字符串	【格式】SimpleDateFormat对象
	SimpleDateFormat对象.format(date);
	
字符串 -> Date对象 【格式】SimpleDateFormat对象
	SimpleDateFormat对象.parse(字符串);
	
// 字符串用来展示
// 毫秒值用来计算

06-时间日期类-JDK8的体验

JDK8日期时间处理,比Date类更加方便,提供的API也更丰富

07-JDK8时间类-获取时间对象

  • 三个主要的类
- LocalDateTime 日期 时间
- LocalDate 日期
- LocalTime 时间
  • 静态方法:now、of
- 系统当前日期时间
	public static LocalDateTime now()
- 指定日期时间
	public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second)
	public static LocalDateTime of(年, 月, 日, 时, 分, 秒)
  • 扩展:时区
- 指定时区
public static LocalDateTime now(ZoneId zone)
- 时区格式:
ZoneId.of("洲名/国家名");
- 例:
LocalDateTime.now(ZoneId.of("Europe/London"));

08-JDK8时间类-获取时间中的每一个值

get系列

- 年
	public int getYear()	获取年
- 月
	public Month getMonth()	获取月份(1-12)【枚举】
	public int getMonthValue()	获取月份(1-12)
- 天
	public int getDayOfMonth()	获取一个月中的第几天(1-31)
	public int getDayOfYear()	获取一年中的第几天(1-366)
- 星期
	public DayOfWeek getDayOfWeek()	获取星期(星期一 - 星期日)【枚举】
- 时
	public int getHour()	获取小时(0-23)
- 分
	public int getMinute()	获取分钟(0-59)
- 秒
	public int getSecond()	获取分钟(0-59)

09-JDK8时间类-转换方法

to系列

- LocalDateTime 转换 LocalDate
	public LocalDate toLocalDate()	年月日
	
- LocalDateTime 转换 LocalTime
	public LocalTime toLocalTime()	时分秒

10-JDK8时间类-格式化和解析

  • JDK8格式化解析类,DateTimeFormatter
- 定义:
	public static DateTimeFormatter ofPattern(String pattern)
- 说明:
	参数:【格式】
	返回值:格式化对象
  • 格式化和解析

注意:格式化和解析方法是谁的方法

- 格式化:
- 定义:
	public String format(DateTimeFormatter formatter)
- 说明:
    参数:格式化对象
    返回值:格式化后的字符串
    作用:按照一定【格式】将日期格式化后的字符串
    
- 解析:
- 定义:
	public static LocalDateTime parse(CharSequence text, DateTimeFormatter formatter)
-说明:
	参数:字符串,格式化对象
	返回值:解析后的日期时间对象
	作用:按照一定的【格式】将字符串转换成日期时间对象
  • 格式化和解析与Date类比较
- 日期格式化类:
	Date	->	SimpleDateFormat
	LocalDateTime	->	DateTimeFormatter

- 格式化解析方法:	format(格式化)、parse(解析)
SimpleDateFormat 是方法的调用者
LocalDateTime	是方法的调用者

11-JDK8时间类-plus系列方法

plus系列:作用

public LocalDateTime plusYears (long years) 添加或者减去年
public LocalDateTime plusMonths(long months) 添加或者减去月
public LocalDateTime plusDays(long days) 添加或者减去日
public LocalDateTime plusHours(long hours) 添加或者减去时
public LocalDateTime plusMinutes(long minutes) 添加或者减去分
public LocalDateTime plusSeconds(long seconds) 添加或者减去秒
public LocalDateTime plusWeeks(long weeks) 添加或者减去周

- 属于LocalDateTime类的成员方法
- 参数:
  正数:当前LocalDateTime对象,时间向后加指定值
  负数:当前LocalDateTime对象,时间向前减指定值
- 返回值:
  返回新的LocalDateTime对象,新对象的日期时间,是原来对象日期时间加减后的值

12-JDK8时间类-minus系列方法

minus系列:作用,与plus相似

public LocalDateTime minusYears (long years) 减去或者添加年
public LocalDateTime minusMonths(long months) 减去或者添加月
public LocalDateTime minusDays(long days) 减去或者添加日
public LocalDateTime minusHours(long hours) 减去或者添加时
public LocalDateTime minusMinutes(long minutes) 减去或者添加分
public LocalDateTime minusSeconds(long seconds) 减去或者添加秒
public LocalDateTime minusWeeks(long weeks) 减去或者添加周


- 方法:
	- 属于LocalDateTime类成员方法
- 参数:
	正数:当前LocalDateTime对象,时间向前减指定值
	负数:当前LocalDateTime对象,时间向后加指定值
- 返回值:
	返回新的LocalDateTime对象,新对象的日期时间,是原来对象日期时间加减后的值

13-JDK8时间类-with系列方法

with系列:作用,修改时间

public LocalDateTime withYear(int year) 直接修改年
public LocalDateTime withMonth(int month) 直接修改月
public LocalDateTime withDayOfMonth(int dayofmonth) 直接修改日期(一个月中的第几天)
public LocalDateTime withDayOfYear(int dayOfYear) 直接修改日期(一年中的第几天)
public LocalDateTime withHour(int hour) 直接修改小时
public LocalDateTime withMinute(int minute) 直接修改分钟
public LocalDateTime withSecond(int second) 直接修改秒

- 方法:
	- 属于LocalDateTime类成员方法	
- 返回值:
	返回新的LocalDateTime对象,新对象的日期时间,是原来对象日期时间加减后的值
- 设置的值超出了范围
	会报错
  • 小结
- 都是对日期时间的修改
	- plus、minus系列是在原来日期时间上进行的加减
	- with系列是直接修改指定值
- 三系方法都不会修改原来的对象,而是将修改后的结果通过新的对象返回	
  • 扩展:比较时间大小
public boolean isAfter(另一个时间日期对象)
public boolean isBefore(另一个时间日期对象)
public boolean isEqual(另一个时间日期对象)

14-JDK8时间类-时间间隔对象

1 Period

作用:获取两个时间日期类相差具体的值 年月日

  • 获取Period对象
public static Period between(LocalDate startDateInclusive, LocalDate endDateExclusive)

参数:两个LocalDate对象
注意:第一个参数小(时间早),第二个参数大(时间晚)	->	比较的结果是正数
	第一个参数大(时间晚),第二个参数小(时间早)	->	比较的结果是负数
	第一个参数和第二个参数相同	->	比较的结果是0
返回值:Period对象
  • Period成员方法
public int getYears() 获得这段时间的年数
public int getMonths() 获得此期间的月数
public int getDays() 获得此期间的天数
public long toTotalMonths() 获取此期间的总月数

注意:
	获得指定差值:年、月、日(不求和)
	获得相差总月数:(求和)
2 Duration
  • 获取Duration对象
- 定义
public static Duration between(Temporal startInclusive, Temporal endExclusive)
- 说明:
参数:(LocalDateTime,LocalTime)都可以
注意:第一个参数小(时间早),第二个参数大(时间晚)	->	比较的结果是正数
	第一个参数大(时间晚),第二个参数小(时间早)	->	比较的结果是负数
	第一个参数和第二个参数相同	->	比较的结果是0
返回值:Duration对象
  • 注意
between方法的两个时间日期类型必须包含秒,否则会报错
  • Duration成员方法
- 获取总的差值(按单位)
- 例如:总的秒数	->	其他单位都转换成秒 求总和
public long toDays() 获得此时间间隔的总天数
public long toHours() 获得此时间间隔的总小时数
public long toMinutes() 获得此时间间隔的总分钟数
public long toSeconds() 获得此时间间隔的总秒数
public long toMillis() 获得此时间间隔的总毫秒数
public long toNanos() 获得此时间间隔的总纳秒数

- 可以获得指定差值	-> 不求和
这一类API以Part结尾
public long toDaysPart() 获得此时间间隔的总天数
public long toHoursPart() 获得此时间间隔的小时数
public long toMinutesPart() 获得此时间间隔的分钟数
public long toSecondsPart() 获得此时间间隔的秒数
public long toMillisPart() 获得此时间间隔的毫秒数
public long toNanosPart() 获得此时间间隔的纳秒数
  • 代码
public class Test7 {
    public static void main(String[] args) {
        // 两个时间日期类对象
        // 注意点:参数需要有秒
//        LocalDate localDate1 = LocalDate.of(2020,6,6);
//        LocalDate localDate2 = LocalDate.of(2022,12,20);
        // 2020-11-11 11:11:11
        LocalDateTime localDateTime1 = LocalDateTime.of(2020,11,11,11,11,11);
        // 2020-11-11 12:12:11
        LocalDateTime localDateTime2 = LocalDateTime.of(2020,11,11,12,12,12);
        // 获取Duration对象
        Duration duration = Duration.between(localDateTime1, localDateTime2);
        // public long toDays() 获得此时间间隔的总天数
        //public long toHours() 获得此时间间隔的总小时数
        //public long toMinutes() 获得此时间间隔的总分钟数
        //public long toSeconds() 获得此时间间隔的总秒数
        //public long toMillis() 获得此时间间隔的总毫秒数
        //public long toNanos() 获得此时间间隔的总纳秒数
        System.out.println(duration.toMinutes());

        //public long toDaysPart() 获得此时间间隔的天数
        //public long toHoursPart() 获得此时间间隔的小时数
        //public long toMinutesPart() 获得此时间间隔的分钟数
        //public long toSecondsPart() 获得此时间间隔的秒数
        //public long toMillisPart() 获得此时间间隔的毫秒数
        //public long toNanosPart() 获得此时间间隔的纳秒数
        System.out.println(duration.toMinutesPart());
    }
}

https://github.com/xkzhangsan/xk-time

  • 练习

jdk8 日期类API

需求
	1.房租一个月1000元
	2.按季度缴费(3个月)
	3.实现:控制台输入信息选择(1.查看当前是否欠租,2.查看什么时候到期,3.缴费,4.退出)
思路:
	1.初始化最近一次缴费的日期(yyyy-MM-dd)
	2.定义按季度缴费
	3.当用户输入1时,控制台打印是否欠租
	4.当用户输入2时,控制台打印到期的日期(yyyy-MM-dd)
	5.当用户输入3时,控制台提示请输入金额
		交3000
		
	6.用户输入1和2验证是否正确
  • 扩展:工具类【理解】
// 一般的特点
1.final 不能被继承
2.构造方法私有化
3.变量、方法都是静态的
  • 代码
public final class DateUtil {

    private DateUtil() {
    }


    public static final String FORMAT = "yyyy-MM-dd";
    public static final String TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

    public static final String FORMAT_CN = "yyyy年MM月dd日";
    public static final String TIME_FORMAT_CN = "yyyy年MM月dd日 HH时mm分ss秒";

    // 比较date1 和 date2大小
    // date1 > date2 返回正数
    // date1 < date2 返回负数
    // date1 = date2 返回0
    public static long diff(Date date1,Date date2){
        long date1Time1 = date1.getTime();
        long date1Time2 = date2.getTime();
        return date1Time1 - date1Time2;
    }
}

15-JDK8时间类-小结

见xmind文档


16-异常的体系结构和异常的分类

  • 异常的定义
- 异常:程序出现了不正常的情况。程序在执行过程中,出现的非正常情况,最终会导致JVM的非正常停止

- 异常理解:
	- 逻辑问题:(程序也不知道怎么处理了)
		yyyy-MM
		2021年12月
		10 / 0
		数组越界
	- 可避免:
		String str = null;
		if(str != null){
		
		}
  • 异常体系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hMqVm3e4-1634831996582)(day06随堂笔记.assets/异常体系.png)]

  • 异常分类
- 编译时异常:RuntimeException以外的异常
	- 必须处理,否则编译不通过
- 运行时异常:RuntimeException及其子类
	- 运行时异常可以处理,也可以不处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UdOBvxwY-1634831996583)(day06随堂笔记.assets/编译时期异常和运行时期异常.png)]

17-虚拟机默认处理异常的方式

  • 问题:什么时候由虚拟机处理异常?虚拟机处理异常做了哪些事?
- 程序本什么没处理,交给虚拟机处理
- 哪里有异常就在哪里创建了一个异常
- 做了哪些事情?
	1.打印异常信息(红色字体)
	2.终止程序运行 --- 哪里出异常,就在哪里终止

18-throws声明异常

  • 问题:throws如何定义,定义在什么位置,有什么作用?

处理异常的一种方式

当前方法内可能出现异常,方法用throws关键字做了处理:交给方法的调用者

1.定在方法参数() 和方法体 {} 之间
2.把可能出现的异常交给方法的调用者

19-声明异常的注意事项

  • 注意事项
- throws 异常名
	- 异常名属于运行时异常,可以不用写
	- 异常名属于编译时异常,必须throws声明(或者自己处理)
  • 思考:为什么编译时异常,必须声明?运行时异常可以不声明?
- throws 异常名
	- 异常名属于运行时异常,可以不用写
	- 异常名属于编译时异常,必须throws声明(或者自己处理)

20-throw抛出异常

  • 问题:throw使用格式是什么?
- 方法体定义一个异常,并抛出
throw new 异常类名();
  • throw的理解
- throw
	定义异常,从方法内抛出异常
- throws(处理异常,交给调用者)
	交给调用者,在方法处声明异常
- 避免异常
	逻辑代码避免这个异常
	已知可能出现的异常,用逻辑避免这个异常

21-try…catch自己处理异常

  • 问题try…catch格式是什么?
try{
	// 有可能出现异常的代码
} catch (异常类型 变量名){
	// 出现异常之后出现的代码
}
System.out.println("我可以正常运行了");
  • 好处
能让程序继续运行

22-try…catch的常见问题【重点】

try…catch代码执行流程

try {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入你的年龄");
    String line = sc.nextLine();
    int age = Integer.parseInt(line);//格式化异常
    System.out.println(age);
    System.out.println("我是try中最下面的代码");
} catch (Exception e) {
    System.out.println("我是catch中的代码");
    //以后我们针对于每种不同的异常,有可能会有不同的处理结果.
}
System.out.println("我是try...catch体系 之后的代码");
  • 问题:如果try中没有遇到问题,有什么现象?
- catch中的代码不执行
  • 如果try中遇到了问题,try下面的代码块还会执行吗?
- try报错的下面的代码不执行
System.out.println("我是try中最下面的代码");
try {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入你的年龄");
    String line = sc.nextLine();
    int age = Integer.parseInt(line);//格式化异常
    System.out.println(age);
    System.out.println("我是try中最下面的代码");
} catch (NullPointerException e) {
    System.out.println("我是catch中的代码");
    //以后我们针对于每种不同的异常,有可能会有不同的处理结果.
}
System.out.println("我是try...catch体系 之后的代码");
  • 问题:如果try中的问题没有被捕获,会出现什么问题?
- 因为try中报的是NumberFormatException 类型转换异常
- 而catch捕获的是NullPointerException
- 报的异常和捕获的异常 类型不匹配
	导致下面的现象:
	- try...catch相当于没写,交给虚拟机处理
	
最终结果:
	"我是try中最下面的代码"
	"我是catch中的代码"
	"我是try...catch体系 之后的代码"
	【都没有执行】
  • 问题:如果有多个异常,该怎么处理?
最理想的方式:
- 有几个异常就用几个catch代码块,捕获的异常类型要和try中可能报的异常 类型匹配
注意:
	- 多个catch中如果有子父类异常类型存在,父类异常要写在下面
	
	
好处:分类捕获异常,分别进性处理
弊端:有可能会漏掉异常
	
- catch中用最顶层父类捕获异常
好处:不会漏异常
弊端:不能分类,有针对性处理异常
  • 小结:运行时异常、编译期异常;throws、throw、try{}catch(){} 、避免异常【理解】
运行时异常:RuntimeException及其子类
	不需要处理
编译期异常:除RuntimeException及其子类以外的
	必须要处理
	
两种处理异常的方式:
	throws 方法上 
	try{}catch(){} 对有可能出现异常的代码 运行流程

throw:在方法体内定义了一个异常 throw new 异常类名()

避免异常: 通过逻辑处理
	弊端:方法的调用者不知道发生了什么

23-throwable成员方法

  • 异常消息基本组成
- 格式:
包名.异常类名: 异常描述
	at 包名.类名.方法名(类名.java:行号)
	....

- 示例:
java.lang.NumberFormatException: For input string: "aaa"
	at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.base/java.lang.Integer.parseInt(Integer.java:652)
	at java.base/java.lang.Integer.parseInt(Integer.java:770)
	at com.itheima.exce.TestTryCache.main(TestTryCache.java:11)	
  • 成员方法
public String getMessage()	异常描述	->	错误原因
public String toString()	包名.异常类名: 异常描述	包名.异常类名	->	报的什么类型的异常
public void printStackTrace()	所有信息

24-异常的小练习

键盘录入学生的姓名和年龄,其中年龄为18-25岁
超出这个范围是异常数据不能复赋值,需要重新录入,一直录入到正确为止

思路:
	- 创建学生对象
	- 键盘录入学生信息,并封装学生对象
	- 如果是非法数据就再次录入

25-自定义异常

  • 问题:如何自定义异常?
- 继承RuntimeException 或者 继承Exception
	- RuntimeException 运行时异常
	- Exception	编译时异常
- 重写构造方法
	- 无参
	- 有参(String message)
- 异常命名要见名知意

- 自定义异常的作用:
	多个catch中 明确目标去捕获异常

public class AgeOutOfBoundsException extends RuntimeException {
    public AgeOutOfBoundsException() {
    }

    public AgeOutOfBoundsException(String message) {
        super(message);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值