今日内容
零、 复习昨日
一、日期类
二、异常
零、 复习昨日
1为什么要重写toString
- Object类toString返回的是对象名字+@+地址,无意义
- 子类重写toString() 返回的对象属性内容
2为什么要重写equals
- Object类equals判断是对象的地址值是否相等,无意义
- 子类重写equals,为了判断对象的属性值是否一样
3String,StringBuffer和StringBuilder有什么异同点
4什么是自动装箱,自动拆箱
- 装箱(基本-包装类);拆箱(包装-基本)
- 自动装箱/拆装就是 无需new或者调用方法之间赋值,会默认进行
5Integer类将字符串解析为int的方法
- 示例: int a = Integer.parseInt(“1”);
- 方法签名: static int parseInt(String s)
一、日期类
Date类,代表某一瞬间的日期时间,现在使用的是java.util.Date,使用时不要导错包!
1.1 构造方法
通过构造方法,可以创建日期对象,代表一个某一瞬间的时间
public static void main(String[] args) {// 空参构造,创建当前时间Date date = new Date( );System.out.println(date );// 指定long型毫秒值创建时间/*** 基础常识: 毫秒值的原点* 1970-01-01 00:00:00 0.000** 1秒 = 1000毫秒*/// 创建1970-01-02Date date2 = new Date(1 * 24 * 60 * 60 * 1000);System.out.println(date2 );// 指定年月日创建时间(过时了,不建议)2000-2-3// 了解: 年份-1900,月份从0-11Date date3 = new Date(100, 1, 3);System.out.println(date3 );}
1.2 方法
方法基本都是过时了,不建议用,但是有两个没有过时,重点
- long getTime(); 获得毫秒值
- void setTime(long t); 设置时间
// 获得毫秒值long time = date.getTime( );System.out.println(time );// 给日期对象设置毫秒值(long型,需要加L),改变时间date.setTime(1609775621813L);System.out.println(date );
1.3 实战应用场景[重要]
创建一个类,学生类 属性(整型年龄,字符串姓名,浮点型成绩,日期型生日
)要封装,创建对象查看效果
二、SimpleDateFormat
SimpleDateFormat类用来对日期格式化和解析
- 格式化(format): 是将日期 --> 字符串
- 解析(parse) : 是将 字符串 —> 日期
日期解析和格式化需要指定模板
- y: 年
- M: 月
- d: 日
- H: 24小时制 h是12小时制
- m: 分
- s: 秒
常用模板
- yyyy/MM/dd 2024/03/07
- yy年M月d日 24年3月7日
- yyyy-MM-dd HH:mm:ss 2024-03-07 10:04:50
演示
public static void main(String[] args) throws ParseException {// 以指定模板创建对象SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");// 格式化(日期 --> 字符串)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 );}
三、异常
Throwable类是java中最大的异常父类,有两个子类:Error和Exception
Error: 是程序出现的严重错误,一旦遇到必须抛出错误并解决
Exception: 是程序中的异常
3.1 介绍
是什么? 异常(Exception )就是程序中的报错
异常(Exception )的分类
- 运行时异常: RuntimeException及其子类
- 编译时异常: 除了RuntimeException及其子类都是编译异常
运行时异常和编译时异常什么区别?
运行时异常
是运行时才有可能出现的异常,编码阶段不用特殊处理编译时异常
编码阶段必须处理如何处理异常?
抛出
异常捕获
异常
3.2 抛出异常
抛出语出的语法:
- 在方法参数列表后,{}前,使用
throws+异常类名
声明抛出的异常类
抛出异常,可以同时声明抛出多个异常类,逗号隔开
方法声明了抛出异常,如果真的抛出异常会有什么效果?
- 方法抛出异常前,正常执行
- 抛出异常后会将信息打印到控制台
后续代码不再执行
异常是层层抛出的
3.3 试图捕获异常
语法:
try{// 一些代码,可能会出现异常的代码 }catch(异常类 对象名){// 如果上面有异常,且能抓住,此处就会执行 }
执行顺序:
- try内代码如果没问题,catch内就不执行
- try内代码有报错,catch抓住后就执行
- try
内部
如果有报错,try代码从报错处往后不再执行- 无论有没有报错,try-catch后代码都会执行
public static void main(String[] args) {System.out.println(1 );System.out.println(2 );// try{// System.out.println(3/0 );// }catch (NullPointerException ae){// System.out.println("抓住异常,记录日志"+ae );// }catch (ArithmeticException ae) {// System.out.println("抓住异常,记录日志"+ae );// }try{System.out.println(3.1 );// 可以执行System.out.println(3/0 );// 报错,算术异常System.out.println(3.2); // 不执行}catch (Exception ae){System.out.println("抓住异常,记录日志"+ae );}System.out.println(4 );System.out.println(5 );}
3.4 区别
- 抛出异常,异常处后续不再执行
- 捕获异常,try-catch后代码还可以执行
后续编码时,如何使用抛出?捕获?经验:
- 选哪个处理都行
- 如果后面代码执行与否无所谓,抛出更简单
- 如果后面代码必须执行,捕获异常
重写时候,要求
- 访问修饰符,子类权限 >= 父类
- 返回值类型一致
- 方法名一致
- 参数列表一致
- 异常, 子类异常范围 <= 父类异常范围
特殊的,父类方法如果没有抛出异常,那么子类重写后,子类方法中如果有异常,只能捕获
3.5 finally
finally最终的,配合try或者try-catch一起使用,形如
try{// 代码
}finally{// 代码
}
或者try{//代码}catch(E e) {// 代码}finally{// 代码}
作用:
- fianlly里面的代码无论是抛出异常还是捕获异常,最终都会执行
public static void main(String[] args) {// try{// System.out.println(1/0 );// }finally {// System.out.println("最终执行" );// }try{System.out.println(1/0 );}catch (Exception e){System.out.println("抓住异常" );}finally {System.out.println("最终执行" );}System.out.println("后" );}
}
场景:
- 用于关闭流的资源通道,释放资源(关闭通道,释放资源)
3.6 异常API
- 异常类有构造方法,可以创建对象
- 有一些方法
- getMessage(); 获得异常信息
- toStrinig();将异常信息以字符串形式返回
- printStackTrace(); 打印异常信息
public static void main(String[] args) {// 标准输出流// System.out.println("标准输出" );// 错误输出流// System.err.println("com.qf.2401.04.1.高锦昆超时异常");try {/*** 1/0会报错,java虚拟机会自己创建一个异常对象* 相对于 new ArithmeticException();* 这里出错,就是将这个异常对象抛出*/System.out.println(1/0 );}catch (Exception e){// 这里抓住异常对象,相对于赋值String message = e.getMessage( );System.out.println("异常信息:" + message );String string = e.toString( );System.out.println("异常字符串:" + string );e.printStackTrace();// 将异常信息打印}}
四、自定义异常
- 创建一个异常类,命名合适
- 找到一个合适父异常类,继承
- 继承的是RuntimeException及其子类的异常 那么自己的异常就是运行时异常
- 否则就是编译期异常
- 设置构造方法,将异常信息通过super传递给父类
- 使用异常
- 在方法内部,通过判断决定是否抛异常
- 如果要抛,通过throw+异常对象抛出
练习: 设置一个价钱越界异常
,给手机类使用,当手机价格不合适的时候抛出异常
// 价钱越界异常类
public class PriceOutOfBoundsException extends RuntimeException{public PriceOutOfBoundsException(double price){super("价格: "+price+" 越界,钱不能为负数!");}}
// 手机类,使用异常
public class Phone {private String name;private double price;public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}// 给手机价钱赋值时,设置异常public void setPrice(double price) {if (price >= 0) {this.price = price;} else { // 手机价钱低于0,要抛出异常throw new PriceOutOfBoundsException(price);}}@Overridepublic String toString() {return "Phone{" +"name='" + name + '\'' +", price=" + price +'}';}
}
// 测试
public static void main(String[] args) {Phone phone = new Phone( );phone.setName("HUAWEI");phone.setPrice(-12000);// 会抛出异常System.out.println(phone );}