一.异常体系
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函数会继续抛给虚拟机来处理
- 捕获和抛出的区别点:
捕获:出现异常后进行了捕获,那么程序仍然可以正常运行
抛出:抛出仅仅只是将问题抛出去了,对抛出去的异常如果没有进行捕获,那最终还是交由了虚拟机来处 理,结果就是报错,停止运行
所以如果需要抛多个异常,就需要采用下面这种方式:
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类
- 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
- 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
- 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"