日期类异常类

日期类&异常类

作业:千位数字相乘

public static void main(String[] args) {// 两个千位数字相乘int[] arr1 = {7,8,9,9,8,9};int[] arr2 = {7,9,8,9,6,8};// 定义结果的数组int[] result = new int[12];for (int i = 0; i < arr1.length; i++) {for (int j = 0; j < arr2.length; j++) {result[i + j] += arr1[i] * arr2[j];}}// 统一处理进位问题for (int i = 0; i < result.length - 1; i++) {int temp = result[i];result[i] = temp % 10;result[i + 1] += (temp / 10);}System.out.println(Arrays.toString(result));}

1 日期类

1.1 Date类

public static void main(String[] args) throws ParseException {// 获取当前时间Date date = new Date();// 设置计算机元年之后的时间date.setTime(10000L);System.out.println(date);// 获取计算机元年到现在的毫秒值System.out.println(date.getTime());// 计算机元年在中国是 1970年1月1日早上8点// 从计算机元年开始加上传入的毫秒值的时间Date date1 = new Date(1718937063489L);System.out.println(date1);// 日期格式化SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");// 把日期转换成字符串
//        String str = simpleDateFormat.format(new Date());
//        System.out.println(str);String str = "2035年10月1日 12:12:12";// 把字符串转日期Date date2 = simpleDateFormat.parse(str);System.out.println(date2);}

1.2 Calendar类

public static void main(String[] args) throws ParseException {// 日历类  获取默认时区的日历Calendar calendar = Calendar.getInstance();// 设置指定的字段
//        calendar.set(Calendar.YEAR,2050);
//        calendar.set(2050,9,1,12,0,0);String str = "2050-10-1 12:12:12";// 把字符串转换成日期SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date = simpleDateFormat.parse(str);// 设置时间calendar.setTime(date);System.out.println(calendar);// 获取日历的相关信息// 年int year = calendar.get(Calendar.YEAR);System.out.println(year);// 月  从0开始  需要加1int month = calendar.get(Calendar.MONTH);System.out.println(month + 1);// 日int day = calendar.get(Calendar.DAY_OF_MONTH);System.out.println(day);// 小时int hour = calendar.get(Calendar.HOUR);System.out.println(hour);// 分int minute = calendar.get(Calendar.MINUTE);System.out.println(minute);// 秒int second = calendar.get(Calendar.SECOND);System.out.println(second);// 毫秒int milliSecond = calendar.get(Calendar.MILLISECOND);System.out.println(milliSecond);// 一年的第几天int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);System.out.println(dayOfYear);// 一个月的第几周int weekOfMonth = calendar.get(Calendar.WEEK_OF_MONTH);System.out.println(weekOfMonth);}

课堂练习:假设每个月的第三周的周五股市开放交易。其他时间无法交易。输入一个时间,判断这个时间是否允许交易并且提示:

交易未开始,交易已结束,交易正在进行中

public static void method() throws ParseException {
//        假设每个月的第三周的周五股市开放交易。其他时间无法交易。
//        输入一个时间,判断这个时间是否允许交易并且提示:
//        交易未开始,交易已结束,交易正在进行中System.out.println("请输入您想查询的日期");Scanner scanner = new Scanner(System.in);// 2018-01-01String str = scanner.next();// 把字符串转换成日期SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");Date date = simpleDateFormat.parse(str);// 获取日历类Calendar calendar = Calendar.getInstance();// 给日历设置时间calendar.setTime(date);// 获取第几周int week = calendar.get(Calendar.WEEK_OF_MONTH);// 获取日int day = calendar.get(Calendar.DAY_OF_WEEK);// 判断交易状态if (week == 3 && day == 6){System.out.println("交易正在进行中");}else if (week < 3 || week == 3 && day < 6){System.out.println("交易未开始");}else {System.out.println("交易已结束");}}

1.3 time包

jdk1.8之后,对时间体系进行了新的划分,将日期和时间以及其他信息进行分割,从而分出来一个代表时间的包---java.time

1.3.1 LocalDate类

只有日期(年月日),没有时间(时分秒)

public static void main(String[] args) {// 获取当前时间LocalDate date = LocalDate.now();System.out.println(date);// 指定日期LocalDate date1 = LocalDate.of(2014, 6, 5);System.out.println(date1);// 添加天数
//        date = date.plusDays(3);// 添加月数
//        date = date.plusMonths(3);// 添加周的天数
//        date = date.plusWeeks(1);// 添加年数
//        date = date.plusYears(3);date = date.plus(3, ChronoUnit.DAYS);System.out.println(date);// LocalDate和String的相互转换// 日期时间格式转换器DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");// 将日期转换成字符串String str = dateTimeFormatter.format(date);System.out.println(str);// 将字符串转换成日期LocalDate date2 = LocalDate.parse(str, dateTimeFormatter);System.out.println(date2);}

1.3.2 LocalTime类

只有时间,没有日期。精确到纳秒

private static void demo2() {// 获取当前时间LocalTime time = LocalTime.now();System.out.println(time);// 指定时间
//        LocalTime time1 = LocalTime.of(18, 0, 1);
//        System.out.println(time1);// 添加时间// 添加小时time = time.plusHours(3);// 添加分钟
//        time.plusMinutes()// 添加秒
//        time.plusSeconds();// 添加纳秒
//        time.plusNanos();time = time.plus(3,ChronoUnit.HOURS);System.out.println(time);// 减少time = time.minus(4,ChronoUnit.HOURS);// 减少小时
//        time.minusHours();// 减少分钟
//        time.minusMinutes()// 减少秒
//        time.minusSeconds()// 减少纳秒
//        time.minusNanos();System.out.println(time);// LocalDate和String的相互转换// 日期时间格式转换器DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH-mm-ss-SSS");// 将日期转换成字符串String str = dateTimeFormatter.format(time);System.out.println(str);// 将字符串转换成日期LocalTime date2 = LocalTime.parse(str, dateTimeFormatter);System.out.println(date2);}

1.3.3 LocalDateTime类

有日期有时间,精确到纳秒

private static void demo3() {// 获取时间LocalDateTime localDateTime = LocalDateTime.now();System.out.println(localDateTime);// 指定时间LocalDateTime dateTime = LocalDateTime.of(2027, 12, 12, 5, 6, 7);System.out.println(dateTime);// 添加时间dateTime = dateTime.plus(3,ChronoUnit.CENTURIES);System.out.println(dateTime);// 减少时间dateTime = dateTime.minus(3,ChronoUnit.HOURS);System.out.println(dateTime);DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss:SSS");// 把日期转换成字符串String str = formatter.format(dateTime);System.out.println(str);// 把字符串转换成日期LocalDateTime parse = LocalDateTime.parse(str, formatter);System.out.println(parse);}

1.3.4 Instant

private static void demo4() {// 当前北京时间距离世界时间相差8小时// 获取当前的北京时间Instant now1 = Instant.now(Clock.offset(Clock.systemUTC(), Duration.ofHours(8)));System.out.println(now1);// 获取当前世界时间Instant now = Instant.now();System.out.println(now);// 添加时间
//        now = now.plus(8,ChronoUnit.HOURS);
//        System.out.println(now);// 比较两个时间的差值long duration = now.until(Instant.now(), ChronoUnit.HOURS);System.out.println(duration);// 获取毫秒System.out.println(now.get(ChronoField.MILLI_OF_SECOND));// 获取微秒System.out.println(now.get(ChronoField.MICRO_OF_SECOND));// 获取纳秒System.out.println(now.get(ChronoField.NANO_OF_SECOND));// 将Instant转换成LocalDateTime类型// ZoneId.systemDefault() 默认时区LocalDateTime localDateTime = LocalDateTime.ofInstant(now, ZoneId.systemDefault());System.out.println(localDateTime);}

1.3.5 间隔相关的日期类

  • Period 用于计算两个日期间隔
		LocalDate d1 = LocalDate.now();LocalDate d2 = LocalDate.of(2022, 12, 12);Period between = Period.between(d2, d1);System.out.println("相差的年数" + Math.abs(between.getYears()));System.out.println("相差的月数" + between.getMonths());System.out.println("相差的天数" + between.getDays());
  • Duration:用于计算两个时间间隔
private static void demo6() {LocalDateTime t1 = LocalDateTime.now();LocalDateTime t2 = LocalDateTime.of(2024, 7, 8, 0, 0, 0);Duration between = Duration.between(t1, t2);System.out.println("相差的总天数" + between.toDays());System.out.println("相差的总小时数" + between.toHours());System.out.println("相差的总分钟数" + between.toMinutes());System.out.println("相差的总秒数" + between.toSeconds());}

2 异常

2.1 异常的基本使用

Throwable是异常的顶级父类。有两大子类:

  • Error 错误 非常严重的问题 需要修改代码才能解决
    • StackOverflowError 栈溢出错误 方法递归没有出口时
    • OutOfMemoryError 堆内存溢出
  • Exception 异常
    • 所有异常的父类,程序中出现了一般性的问题,处理异常后程序会继续执行
    • 异常分为编译时异常和运行时异常
    • 编译时异常在编译阶段需要处理,否则编译不通过
    • 运行时异常在编译阶段不需要处理
    • RuntimeException和它的子类都是运行时异常
    • 其他的异常都是编译时异常
public static void main(String[] args) throws ParseException {
//        m1();m(null);}private static void m1() throws ParseException {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");simpleDateFormat.parse("2010/12/12");}public static void m(String str) throws ParseException{if (str == null)
//            throw new NullPointerException("空指针异常了,哥们");throw new ParseException("",0);// 出现异常// 1. 创建对应的异常对象  new NullPointerException()// 2. 程序立即停止,并且在控制台显示异常的信息boolean aa = str.equals("aa");System.out.println("HelloWorld");}

2.2 自定义异常

定义一个类,继承Exception(RuntimeException),然后提供无参构造和有参构造,有参构造中调用父类的构造方法

// 自定义异常
// 除了RuntimeException和它的子类,其他都是编译时异常
class PathNotExistException extends Exception{public PathNotExistException(){}public PathNotExistException(String message){super(message);}
}class FileFormatException extends Exception{public FileFormatException(){}public FileFormatException(String message){super(message);}
}

2.3 异常的捕获方式

  • 如果出现了多个异常,并且每一个异常的处理方式都不一样,可以使用多个catch分别捕获分别处理。
        try {s = readFile("D:\\a.png");} catch (PathNotExistException e) {System.out.println("出现异常了");// 打印异常栈轨迹
//            e.printStackTrace();System.out.println(e.getMessage());}catch (FileFormatException e){// 处理异常System.out.println(e.getMessage());}catch (NullPointerException e){System.out.println(e.getMessage());}
  • 如果所有异常的处理方式都一样,可以捕获这些异常的父类,然后进行统一的处理。
	String s = null;try {s = readFile("D:\\a.png");} catch (Exception e) {System.out.println("出现异常了");// 打印异常栈轨迹
//            e.printStackTrace();System.out.println(e.getMessage());}
  • 如果异常的处理进行了分组,那么同一组异常之间用| 隔开,进行分组处理
String s = null;try {s = readFile("D:\\a.png");} catch (FileFormatException | PathNotExistException e){// 分组捕获// 处理异常System.out.println(e.getMessage());}catch (NullPointerException e){e.printStackTrace();System.out.println(e.getMessage());}

注意点: 捕获异常的时候应该先捕获子类异常,再捕获父类异常

2.4 异常对方法重写和重载的影响

异常对方法的重载没有影响

class A{public void m()throws IOException{}public void m(int i) throws Exception{}
}

子类抛出的编译时异常不能超过父类对应方法的编译时异常的范围。

运行时异常对于重写没有影响

重写:重写是指在父子类中存在方法签名一致的非静态方法。在构成重写的时候,要求子类重写的方法的权限修饰符的范围要大于等于父类对应方法的权限修饰符范围。如果父类方法的返回值类型是基本数据类型/void,那么子类方法的返回值类型要保持一致。如果父类方法的返回值类型是引用数据类型,那么要求子类方法的返回值类型要么和父类一致,要么是父类方法返回值类型的子类。另外,子类重写的方法抛出的编译时异常不能超过父类对应方法的编译时异常的范围。

重写本身是一种运行时多态。

3 finally

finally修饰代码块,表示无论是否出现异常都会执行的代码块

结果是3

public static int demo1(){try {return 1;}finally {try {return 2;}finally {return 3;}}}

结果是5,7

        System.out.println(demo2());// 5}public static int demo2(){int i = 5;try {// 先进入到try中,执行return i++;  i是5,先return 5 再 i++// i 变成6// 由于有finally,所以不能理解结束方法,执行finally中的i++// i 变成 7,打印// 然后方法整体结束,返回5return i++;}finally {i++;System.out.println("i = " + i);// 7}}

返回蔡依林 44

public static Person demo3(){Person person = new Person();try {person.setName("周杰伦");person.setAge(45);// 因为返回的是对象,是内存中的一块地址// 由于有finally,继续执行,把上面的地址中的属性值2改成蔡依林 44// 所以最终结果就是 蔡依林 44return person;}finally {
//            person = new Person();  如果这行代码不注释,返回的是周杰伦45person.setName("蔡依林");person.setAge(44);}}

返回的是abc

public static String m(){String str;try {str = "abc";return str;}finally {// 地址已经发生了改变str = "def";}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/739496.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

包装类数学类位运算

包装类&数学类&位运算 1 包装类 把基本数据类型包装成引用数据类型byte short int long float double char boolean voidByte Short Integer Long Float Double Character Boolean VoidVoidVoid类构造方法是私有的,所以不能创建对象。并且Void是一个最终类,没有子类。…

EtherCAT转Profinet网关配置说明第二讲:上位机软件配置

EtherCAT协议转Profinet协议网关模块(XD-ECPNS20),不仅可以实现数据之间的通信,还可以实现不同系统之间的数据共享。EtherCAT协议转Profinet协议网关模块(XD-ECPNS20)具有高速传输的特点,因此通过EtherCAT转Profinet网关实现数据传输和控制时速度的提升。在大规模的工业…

2024.7.6 鲜花

梅菲斯特——女王蜂 from K8He ラストチャンスに飢えたつま先が 踊り出すまま駆けたこの夜空 並のスタンスじゃ靡かない 星は宝石の憧れ 浮かぶ涙と汗は血の名残り 目の中でしか泳げなきゃ芝居 だけどステージが逃がさない いついつまでも憧れ 焦がれているよ I’ve never see…

C#学习笔记-事件

事件事件是类的一种成员,能够使类或对象具备通知能力。事件用于对象或类间的动作协调和信息传递。假设类A有某个事件,当这个事件发生时,类A会通知并传递事件参数(可选)给有订阅这个事件的类B,类B根据拿到的事件信息对事件进行响应处理。 事件模型 事件模型的5个组成部分:…

将nodejs迁移到D盘

参考双击安装,指定d盘查看文件夹查看环境变量,自动添加如下Path=D:\software\nodejs\打开cmd验证C:\Users\dogle>node -v v18.14.2C:\Users\dogle>npm -v 9.5.0C:\Users\dogle>echo %PATH% C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\WINDOWS\sy…

bluez 入门

**核心模块**:位于系统的最底层,直接与蓝牙硬件进行交互。核心模块实现了蓝牙的基础协议如HCI (Host Controller Interface),并通过DBUS提供API给上层应用。 **服务守护进程(bluetoothd)**:作为系统的守护进程运行,它处理所有的蓝牙服务和配置,如设备配对、连接管理、配…

chrome 浏览器如何设置不保存表单信息

chrome 浏览器如何设置不保存表单信息如何关闭表单自动填充(测试环境Chrome浏览器) https://download.csdn.net/blog/column/7594878/100576004如何禁用谷歌浏览器中的表单自动填充功能? https://zh-cn.fairsyndication.com/222-how-to-disable-form-autofill-in-google-chr…

数字设计--CDC

异步信号与同步信号 同步信号 频率相同,相位相同的两个信号 频率相同,相位差一定的两个信号 不同频率的两个信号也可能是同步的,比如分频出来的两个信号 异步信号 频率不同的两个信号 频率相同但相位差不定的两个信号 跨时钟域就是要解决信号从异步信号之间传输的问题。 亚稳…

数字设计--亚稳态

亚稳态 FPGA 等数字设备中的所有寄存器都定义了信号时序要求----允许每个寄存器在其输入端正确捕获数据并产生输出信号。为确保可靠操作,寄存器的输入必须在时钟边沿之前的最短时间(建立时间 setup time 或 \(t_{su}\))和时钟边沿之后的最短时间(保持时间 hold time 或 \(t…

数字设计--门控时钟与时钟切换

门控时钟(ICG) 使用门控时钟的原因 芯片功耗组成中,大部分是由时钟树消耗掉的。因为这些时钟树在系统中具有最高的切换频率,而且有很多时钟buffer,并且为了最小化时钟延时,它们通常具有很高的驱动强度。此外,即使输入和输出保持不变,接收时钟的触发器也会消耗一定的功耗。…

ComfyUI进阶篇:ComfyUI核心节点(二)

ComfyUI核心节点(二) 前言: 学习ComfyUI是一场持久战。当你掌握了ComfyUI的安装和运行之后,会发现大量五花八门的节点。面对各种各样的工作流和复杂的节点种类,可能会让人感到不知所措。在这篇文章中,我们将用通俗易懂的语言对ComfyUI的核心节点进行系统梳理,并详细解释每…

题目集7~8

由于个人原因,最后两次题目集未提交,对自己的放纵感到愧疚,后期的补练我也会抽出时间完成这两道题 经过分析,题目集7,是在前面的基础上加上了一个新概念:互斥开关,以及模拟一种受控窗帘, 在我的想法,互斥开关便可当作两个普通开关去完成电路,窗帘则是新增一个用电器。…