今日内容
零、 复习昨日
一、日期类
二、异常
零、 复习昨日
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-02
Date date2 = new Date(1 * 24 * 60 * 60 * 1000);
System.out.println(date2 );
// 指定年月日创建时间(过时了,不建议)2000-2-3
// 了解: 年份-1900,月份从0-11
Date 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);
}
}
@Override
public 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 );
}