异常体系和日期类

本文主要介绍Java的异常体系和日期类。异常体系方面,讲解了异常的抛出(隐式和显示声明)、自定义异常的方法及throw和throws的区别,还探讨了异常处理方案的选择。日期类部分,介绍了Date类、Calendar类、格式化类及SimpleDateFormat自定义日期格式化,以及日期格式转换时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.异常体系

1.抛出

public class ExceptionDemo {

	public static void main(String[] args) throws ArithmeticException {
		method();

	}
	
	public static void method() {
		//模拟异常处理,此处需要手动制造异常 
		int a =1/0;  //隐式声明

1.jdk中已经提供的异常,虚拟机是可以自动识别到的,不需要显示声明,这种方式可以称为隐式声明

2.如果想要显示声明异常,需要用到两个关键字:throws throw

3 .throw 抛出 后面抛出的是异常对象

​ throws 声明 声明的是异常类的类型

相当于我直接告诉你这里存在一个问题,也属于一种解决方案

public static void main(String[] args) throws ArithmeticException {
		method();

	}

	public static void method() throws ArithmeticException{
		//模拟异常处理,此处需要手动制造异常 
//		int a =1/0;  //隐式声明
		
		throw new ArithmeticException("除数不能为0");//throw后面跟的是抛出的对象
		
	}

在声明的时候只需要声明异常类的类型,声明是在类上面写,只需要告诉调用者是哪种问题就可以

调用对象,类名就是类型,问题类型就是ArithmeticException
此时main函数调用method方法,就会得到这个异常,此时还可以继续向外抛出,所以可以在main函数后面加上throws +问题类型 ,main函数会继续抛给虚拟机来处理

  1. 捕获和抛出的区别点:

​ 捕获:出现异常后进行了捕获,那么程序仍然可以正常运行

​ 抛出:抛出仅仅只是将问题抛出去了,对抛出去的异常如果没有进行捕获,那最终还是交由了虚拟机来处 理,结果就是报错,停止运行

所以如果需要抛多个异常,就需要采用下面这种方式:

public static void method() throws ArithmeticException,NullPointerException{
		boolean flag =true;
		if(flag) {
			throw new ArithmeticException("参数不能为0");
		}else {
			throw new NullPointerException("空指针异常");
		}
	}

注意:如果存在多个异常,在抛出时就需要同时声明多个异常,使用逗号隔开

2.自定义异常

1.系统提供的异常是比较常见,但是异常的信息并不是很详细,为了可以按照指定的想法和需求的变更更好的处理异常,也可以通过自定义异常来进行异常处理

2.原则:想要让自定义的类具有可抛性,那就需要继承Exception[RunntimeException]

3.不建议直接继承Throwable ,因为Throwable包含了错误及异常,自定义的是异常,不应该包含错误相关的信息

4.自定义异常里面包含一个空的构造器和一个带参数的构造器

public class MyException extends Exception {
	public MyException() {}
	public MyException(String s) {
		super(s);
	}
}

public class ExceptionDemo2 {

	public static void main(String[] args) throws MyException {
		myMethod();

	}
	/**
	 * 自定义异常必须要进行声明
	 * 自定义异常必须具有可抛性,只需要让它继承某一个父类的异常就可以
	 * @throws MyException
	 */
		public static void myMethod()throws MyException {
			throw new MyException("自定义异常");
			//传过来之后,调用父类构造器
		}
	}

throw和throws的区别:

1、throw是用来抛出异常对象的,throws用来声明异常的

2、throw在方法内的,throws是在方法上的

3、throws可以同时声明多个异常,中间逗号隔开

问题:异常处理的两种方案该如何选择?

回答:功能本身实现时所出现的问题需要捕获处理,由于调用导致的问题则直接抛出

二.日期类

1.日期类 Date

package cn.yunhe.date;

import java.util.Date;

public class DateDemo {

	public static void main(String[] args) {
		Date date= new Date();
		System.out.println("当前的系统时间:"+date);
		//毫秒值1605599425784
		System.out.println("当前系统时间毫秒值:"+date.getTime());
		//毫秒值转化为具体时间
		Date oldDate = new Date(1605599425784L);
		System.out.println("上一次的时间:"+oldDate);
		System.out.println("当前的系统时间:"+date);
		//判断当前时间是否在上一次时间的后面
		System.out.println(date.after(oldDate));//true
		System.out.println(date.before(oldDate));//false
		
		//compareTo() 日期比较  
		System.out.println("日期比较:"+date.compareTo(oldDate));

	}

}

2. Calendar类

  1. Date类中可以获取到日期,但是因为不能国际化,目前推荐使用Calendar类,可以通过Calendar类获取日期中的年月日时分秒等

​ 2. Calendar是一个抽象类,本身是不能直接创建对象的,需要由其子类进行创建并使用,在该类中提供了相关的静态方法,用于直接获取该类的对象,其原理就是在该类中创建其子类对象,在用于父类接收;

扩展:可以在抽象父类中通过子类对象返回父类对象

package cn.yunhe.calendar;

import java.util.Calendar;

/**
 * Calendar主要作用就是用于获取年、月、日、时、分、秒
 */
public class CalendarDemo {
	public static void main(String[] args) {
		//获取Calendar对象
	Calendar calendar = Calendar.getInstance();
	int year=calendar.get(Calendar.YEAR);
	int month=calendar.get(Calendar.MONTH);
	int day = calendar.get(Calendar.DAY_OF_MONTH);
	int hours = calendar.get(Calendar.HOUR_OF_DAY);
	int minutes = calendar.get(Calendar.MINUTE);
	int seconds= calendar.get(Calendar.SECOND);
	int milliSeconds= calendar.get(Calendar.MILLISECOND);
	String date= year+"年"+month+"月"+day+"日"+hours+":"+minutes+":"
	+seconds+":"+milliSeconds;
	System.out.println(date);
	}
}

3.格式化类

1.不管是Date还是Calendar类都需要开发人员手动拼接,比较麻烦,因此提供了格式化类Dateformat,该类存在于java.text包下

2.格式化:将日期按照指定的格式进行输出

3.思考:格式化类本身给提供的日期格式化风格都有哪些?

答: FULL,LONG、MEDIUM和SHORT

SHORT是完全数字的,如12.13.52或3:30pm
MEDIUM较长,如Jan 12, 1952
LONG较长,如January 12, 1952或3:30:32pm
FULL是完全指定的,如Tuesday, April 12, 1952 AD or 3:30:42pm PST

  1. Dateformat 日期格式化
    getDateInstance 年月日
    getTimeInstance 时分秒
package cn.yunhe.dateformat;

import java.text.DateFormat;
import java.util.Date;

public class DateFormatDemo {

	public static void main(String[] args) {
		DateFormat df =DateFormat.getDateInstance(DateFormat.FULL);
		String date = df.format(new Date());//格式化当前日期
		System.out.println("当前日期:"+date);
		
		df=DateFormat.getTimeInstance(DateFormat.SHORT);
		String time=df.format(new Date());
		System.out.println("当前时间:"+time);
		
		//包含了日期和时间,所以要给两个参数
		df=DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.MEDIUM);
		String dateTime= df.format(new Date());
		System.out.println("当前系统时间:"+dateTime);
	}
}

4.SimpleDateFormat自定义日期格式化

package cn.yunhe.simpledateformatdemo;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * SimpleDateFormatDemo 自定义日期格式化
 */
public class SimpleDateFormatDemo {

	public static void main(String[] args) throws ParseException {
		String pattern="yyyy-MM-dd HH:mm:ss";//创建格式化对象
		SimpleDateFormat sdf= new SimpleDateFormat(pattern);//创建日期对象
		String dateTime = sdf.format(new Date());//格式化
		System.out.println("格式化后系统时间:"+dateTime);
		
		//前台传递的一般为字符串类型日期,我们需要给它转变为date类型
		//解析异常通常是因为指定的日期格式与时间字符串的日期格式不匹配
		String dateTimeStr="2020-07-05 15:25:33";
		Date date = sdf.parse(dateTimeStr);
	}
}

通常情况下我们拿到的日期都是字符串类型的,就需要我们将该字符串传换成Date类型,要用到parse关键字

当获取到的日期格式和指定的日期格式不匹配时,是无法进行解析的,会报错,如:

String dateTimeStr="2020/07/05 15:25:33

都需要开发人员手动拼接,比较麻烦,因此提供了格式化类Dateformat,该类存在于java.text包下

2.格式化:将日期按照指定的格式进行输出

3.思考:格式化类本身给提供的日期格式化风格都有哪些?

答: FULL,LONG、MEDIUM和SHORT

SHORT是完全数字的,如12.13.52或3:30pm
MEDIUM较长,如Jan 12, 1952
LONG较长,如January 12, 1952或3:30:32pm
FULL是完全指定的,如Tuesday, April 12, 1952 AD or 3:30:42pm PST

  1. Dateformat 日期格式化
    getDateInstance 年月日
    getTimeInstance 时分秒
package cn.yunhe.dateformat;

import java.text.DateFormat;
import java.util.Date;

public class DateFormatDemo {

	public static void main(String[] args) {
		DateFormat df =DateFormat.getDateInstance(DateFormat.FULL);
		String date = df.format(new Date());//格式化当前日期
		System.out.println("当前日期:"+date);
		
		df=DateFormat.getTimeInstance(DateFormat.SHORT);
		String time=df.format(new Date());
		System.out.println("当前时间:"+time);
		
		//包含了日期和时间,所以要给两个参数
		df=DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.MEDIUM);
		String dateTime= df.format(new Date());
		System.out.println("当前系统时间:"+dateTime);
	}
}

4.SimpleDateFormat自定义日期格式化

package cn.yunhe.simpledateformatdemo;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * SimpleDateFormatDemo 自定义日期格式化
 */
public class SimpleDateFormatDemo {

	public static void main(String[] args) throws ParseException {
		String pattern="yyyy-MM-dd HH:mm:ss";//创建格式化对象
		SimpleDateFormat sdf= new SimpleDateFormat(pattern);//创建日期对象
		String dateTime = sdf.format(new Date());//格式化
		System.out.println("格式化后系统时间:"+dateTime);
		
		//前台传递的一般为字符串类型日期,我们需要给它转变为date类型
		//解析异常通常是因为指定的日期格式与时间字符串的日期格式不匹配
		String dateTimeStr="2020-07-05 15:25:33";
		Date date = sdf.parse(dateTimeStr);
	}
}

通常情况下我们拿到的日期都是字符串类型的,就需要我们将该字符串传换成Date类型,要用到parse关键字

当获取到的日期格式和指定的日期格式不匹配时,是无法进行解析的,会报错,如:

String dateTimeStr="2020/07/05 15:25:33"

在这里插入图片描述

1.编写类MyDate.java 2.该类有如下构造方法 2.1 无参数构造方法public MyDate(),以当前的系统时间构造MyDate对象 2.2 public MyDate(int year, int month, int day), 以指定的年月日构造MyDate对象 3.该类有如下属性 3.1 private int year ;//年 3.2 private int month; //月 3.3 private int day; //日 4.该类有如下方法 4.1 public String after(int day); //返回当前对象代表的日期之后day天的日期,比如当前对象是2008-8-8,调用after(5)以后,该返回2008-8-13,格式可自定义 4.2 public String before(int day); //返回当前对象代表的日期之前day天的日期,比如当前对象是2008-8-8,调用before(5)以后,该返回2008-8-3,格式可自定义 4.3 public void setYear(int year); //设置年为指定值year 4.4 public void setMonth(int month); //设置月为指定值month 4.5 public void setDay(int day); //设置日为指定值day 4.6 public int getYear(); //返回当前对象的年 4.7 public int getMonth(); //返回当前对象的月 4.8 public int getDay(); //返回当前对象的日 4.9 public void set (int year, int month, int day); //设置年、月、日为指定的值year、month、day 4.10 public String toString();//以字符串形式返回当前对象的年月日,例如2008年08月08日,格式可自定义 4.11 public boolean equals(MyDate mydate);//当前对象与另一个对象比较,如果两个对象的年月日均相等,则返回true,反之返回false 5.编写TestMyDate.java,在main方法中对MyDate类的各个方法进行测试 6.按照编程规范为MyDate.java编写规范的代码 7.按照java doc API的要求,对代码编写规范的注释,然后利用javadoc.exe命令生成MyDate.java的API doc 8.撰写上机报告
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值