晨考
装箱(基本-包装类);拆箱(包装-基本)
自动装箱/拆箱就是无需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();打印异常信息
四、自定义异常
- 创建一个异常类,命名合适
- 找到一个合适父异常类,继承
- 继承的是RuntimeException及其子类的异常,那么自己的异常就是运行时异常
- 否则就是编译期异常
- 设置构造方法,将异常信息通过super传递给父类
- 使用异常
- 在方法内部,通过判断决定是否抛出异常
- 如果要抛,通过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+"天");
}