day14_日期类_异常

晨考

  • 装箱(基本-包装类);拆箱(包装-基本)

  • 自动装箱/拆箱就是无需new 或者调用方法之间赋值,会默认进行

  • Integer类将字符串解析为int的方法
    • 示例:int a = Integer.parseInt(“1”);
    • 方法签名:static int parseInt(String s)
  • 需要记住的重点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一、日期类

Date类,代表某一瞬间的日期时间,使用的是java.util.Date包,使用时不要导错包!

1.1构造方法

通过构造方法,可以创建日期对象,代表一个某一瞬间的时间

//空参构造,创建当前时间
Date date = new Date();
System.out.printIn(date);

//指定long型毫秒值创建时间
//基础常识:毫秒值的原点  1970-01-01 00:00:00  0.000
// 1秒 = 1000 毫秒
 Date = date2 = new Date(1*24*60*60*1000);
 System.out.printIn(date2);  //创建1970-01-02

1.2方法

方法基本都过时了,不建议用,但有两个重点

  • 获得毫秒值(从1970到现在的毫秒值) long time = date.getTime();
  • 设置毫秒值(毫秒值是long型加l/L),改变时间 void date.setTime(毫秒值L);

二、SimpleDateFormat

SimpleDateFormat对日期进行格式化和解析

  • 格式化(format):是将日期—>字符串
  • 解析(parse):是将字符串—>日期
    • parse方法源码中有抛出编译期异常,需要处理
    • 解析成功的前提是 字符串和日期模板一致

日期解析和格式需要指定模板

  • y—年

  • M—月

  • d----日

  • H----24小时制,h —12小时制

  • m-----分

  • s-----秒

  • S-------毫秒


    常用模板

  • yyyy/MM/dd 2024/03/07

  • yy年M月d日

  • yyyy-MM-dd HH:mm:ss

       //指定模板创建对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");

        //格式化format(日期--- 字符串)
        Date date = new Date();
        String format = sdf.format(date);
        System.out.println(format);

        //解析parse(字符串---日期)
        Date parse = sdf.parse("2020年01月01日");
        System.out.println(parse);

三、异常

3.1介绍

Throwable类是Java中最大的异常父类,有两个子类Error和Exception

  • Error:是程序中严重的问题,一旦出现就必须要抛出并解决

  • Exception:是程序中的异常

  • System.out.printIn(“标准输出”);

  • System.err.printIn(“错误输出”);


异常(Exception)就是程序中的报错,异常(Exception)分为两类

  • 运行期异常:RuntimeException及其子类
  • 编译期异常:除了RuntimeException及其子类都是编译异常

运行时异常和编译期异常的区别

  • 运行时异常时运行时才有可能出现,编码阶段不用特殊处理
  • 编译时异常编码阶段必须处理

如何处理异常

  • **抛出**异常
  • **捕获**异常

3.2抛出异常

抛出异常的语法:

  • 在方法参数列表后,{}前使用**throws+异常类名**来声明抛出的异常类

    public class IdCardOutBoundException extends RuntimeException {
    }
    

抛出异常,可以同时抛出多个异常类名

public static void main(String[] args) throws ParseException,RuntimeException {

方法声明了抛出异常,运行时不一定,如果真抛出异常的效果

  • 抛出异常前正常执行
  • 抛出异常会将报错信息在控制台显示
  • 并且有错误的那句代码之后不执行
  • 抛出异常会抛给调用者,会层层向上抛,主方法抛出异常是抛给控制台

3.3捕获异常

语法:

try{
 // 一些代码,可能会出现异常的代码
}catch(异常类 对象名){
 // 如果有异常,且能被抓住才执行
}

执行顺序:

  • try内代码如果有没问题,catch内就不执行
  • try内代码有报错,catch抓住后就会执行
  • try内如果有报错,try代码从报错处跳出到catch往后不再执行
  • 无论有没有报错,try–catch后的代码都会执行
  • 可以直接抓一个大的
try {
            System.out.println(3 / 0); 
        }catch (Exception ae){
            System.out.println("抓住异常,记录日志"+ae);
        }

3.4区别

  • 抛出异常,异常处后续不再执行
  • 捕获异常,try–catch后代码还可以执行

后续编码时,如何选择抛出或捕获,经验:

  • 选哪个处理都行
  • 如何后面代码执行与否无所谓,抛出更简单,但谁用都要抛出,不抛要报错
  • 如果后续代码必须执行,捕获异常

重写时候,要求:

  • 访问修饰符:子类>=父类 (public>protect>package>private)
  • 返回值类型一致
  • 方法名一致
  • 参数列表一致
  • 异常:子类异常范围<=父类异常范围

特殊的,父类方法如果没有抛出异常,那么子类重写后,子类方法中如果有异常,只能捕获

3.5finally

finally最终地,配合try或者try–catch一起使用,形如

try{
    //代码
}finally{
    //代码
}
或者
    try{
        //代码
    }catch(E e){
        //代码
    }finally{
        //代码
    }

作用:

  • finally里面的代码是try或者try–catch无论怎么样都会执行

场景:

  • 用于关闭流的资源通道,释放资源

3.6异常API

  • 异常类有构造方法,可以创建对象
  • 有一些方法
    • getMessage();获得异常信息
    • toString();将异常信息以字符串形式返回
    • printStackTrace();打印异常信息

四、自定义异常

  1. 创建一个异常类,命名合适
  2. 找到一个合适父异常类,继承
    1. 继承的是RuntimeException及其子类的异常,那么自己的异常就是运行时异常
    2. 否则就是编译期异常
  3. 设置构造方法,将异常信息通过super传递给父类
  4. 使用异常
    1. 在方法内部,通过判断决定是否抛出异常
    2. 如果要抛,通过throw+异常对象抛出

练习:设置一个身份证越界异常,给验证输入错误身份证号时抛出异常

//身份证号格式异常类

public class IdCardOutBoundException extends RuntimeException{
    public IdCardOutBoundException(String idcard){
        super("身份证格式"+idcard+"异常");
    }
}

//在类中,使用身份证异常

 		  Scanner scanner = new Scanner(System.in);
        System.out.print("请输入身份格式:");
        String idcard = scanner.next();

        //判断输入的身份证格式是否是18位
        if (idcard.length() != 18){
            throw new IdCardOutBoundException(idcard);
        } 

//测试结果

请输入身份格式:123114
Exception in thread "main" com.qf.homework.IdCardOutBoundException: 身份证格式123114异常
at com.qf.homework.Test1.main(Test1.java:22)

作业:

//输入一个人的身份证号获取出生年月日,判断到当前日期,一共活了多少天

public static void main(String[] args) throws ParseException {
        // String idcard = "411123200007251234";
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入您的身份证号:");
        String idcard = scanner.next();
        String birthday = idcard.substring(6, 14); // 截取字符串是出生日期

        Date date = new Date(); // 获得当前的日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");  // 规定模板
        //解析parse  生日日期转换为日期
        Date parse = sdf.parse(birthday);
        long time = parse.getTime(); // 得到出生日期的毫秒值
        System.out.println("生日的毫秒值:"+time);

        //当前日期转换的毫秒值
        long time1 = date.getTime();
        System.out.println("当前的毫秒值:"+time1);

        long lateTime = time1 - time; // 求现在日期毫秒值和生日毫秒值的差值
        long dayTime = 1000*24*60*60; // 求一天的毫秒值数

        int daySum = (int)(lateTime/dayTime);  // 差值毫秒值/一天毫秒值得到相差的天数
        System.out.println("此人出生到现在活了"+daySum+"天");

    }
  • 41
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值