承接Day14的Date类
(一)SimpleDateFormat类及其常用方法
1.为什么要学这个类
因为Date对象打印的结果日期显示的方式和中国人喜欢的方式不一样,需要对日期的显示格式进行调整,调整为我们熟悉和喜欢的显示格式,SimpleDateFormat这个类就是提供可以格式化日期显示方式的功能。
2.SimpleDateFormat:
在java.text包下,使用时必须导包,SimpleDateFormat是一个一语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化 日期Date----->文本String 解析文本----->日期 和规范化。
3.SimpleDateFormat类及其常用方法
4.SimpleDateFormat类的常用方法
案例:
public class Demo01 {
public static void main(String[] args) throws ParseException {
//空参构造创建一个日期格式化对象,有默认的格式
SimpleDateFormat sdf1 = new SimpleDateFormat();
Date d1 = new Date();
System.out.println(d1);
//调用把日期转String的方法 String format(Date date)
String ts1 = sdf1.format(d1);
System.out.println(ts1);
String s1 = "21-11-11 下午5:20";
//String转Date对象的方法,Date parse(String str)
Date d2 = sdf1.parse(s1);
System.out.println(d2);
}
}
public class Demo02 {
public static void main(String[] args) throws ParseException {
//创建一个自定义格式的SimpleDateFormat对象
SimpleDateFormat sdf = new SimpleDateFormat("yy年MM月dd日 11:11:11");
Date d1 = new Date();
String ts1 = sdf.format(d1);
//定义一个字符串
String ts2 = "21年11月1日 11:11:11";
Date d2 = sdf.parse(ts2);
System.out.println(ts1);
System.out.println(d2);
}
}
注意事项:
使用SimpleDateFormat进行解析的时候必须做到日期字符串的格式和SimpleDateFormat对象内部的格式一模一样,否则程序会报异常。
(二)Calendar日历类及其常用方法
1.Calendar是一个抽象类,不能创建对象,在这个类中提供一个方法:getInstance()就可以返回一个该类的子类对象,提供了很多字段,方便获取日历对象所描述的时间信息。
2.Calendar类及其常用方法
案例:
import java.util.Calendar;
import java.util.Date;
public class Demo01 {
public static void main(String[] args) {
//获取一个日历对象
//不能new对象,使用他提供的方法获取该类对象
Calendar cal = Calendar.getInstance();
System.out.println(cal);//通过打印得出,日历对象存储了很多关于时间的字段信息,比Date丰富
//返回给定日历字段值
int year = cal.get(Calendar.YEAR);
System.out.println(year);
int month = cal.get(Calendar.MONTH);
System.out.println(month+1);
int day = cal.get(Calendar.DAY_OF_MONTH);
//将给定的日历字段设置为给定的值
cal.set(Calendar.YEAR,2022);
System.out.println(cal);
cal.set(Calendar.MONTH,20);
System.out.println(cal.get(Calendar.YEAR));
Calendar cal2 = Calendar.getInstance();
cal2.add(Calendar.MONTH,2);
System.out.println(cal2);
//日历转日期
Date d =cal2.getTime();
System.out.println(d);
//返回当前时间的毫秒值
long time = cal2.getTimeInMillis();
System.out.println(time);
}
}
一、NumberFormat类以及使用
(一)NumberFormat类以及使用
1.NumberFormat:
在java.text包下,使用时需要导包,NumberFormat是所有数值格式的抽象基类,此类提供格式化和解析数值的接口,还提供了一些方法来确定哪些语言环境具有数值格式,以及它们的名称是什么。
2.NumberFormat类以及使用
案例:
public class Demo01 {
public static void main(String[] args) {
//public static final NumberFormat getInstance()
//普通格式化对象
//设置小数点后保留几位,整数部分保留几位
NumberFormat nf1 = NumberFormat.getInstance();
nf1.setMaximumFractionDigits(2);//小数部分保留几位
nf1.setMaximumIntegerDigits(3);//整数部分保留几位
String s1=nf1.format(3100.1443241234);//输入要格式化的值
System.out.println(s1);
//public static final NumberFormat getCurrencyInstance()
//(货币数值)返回当前语言环境的货币格式
//10000.312的人民币,希望以人民币格式显示,显示10位整数部分,小数显示2位
NumberFormat nf2 = NumberFormat.getCurrencyInstance();
nf2.setMaximumFractionDigits(2);
nf2.setMaximumIntegerDigits(45);
String s2 = nf2.format(1000.2123);
System.out.println(s2);
//public static final NumberFormat getPercentInstance()
//(百分比数值)返回当前语言环境的百分比格式
//1.521数据,希望以百分比格式显示,小数显示2位
NumberFormat nf3 = NumberFormat.getPercentInstance();
nf3.setMaximumIntegerDigits(2);
nf3.setMaximumFractionDigits(0);
String s3 = nf3.format(1.531);
System.out.println(s3);
}
}
二、Arrays类
import java.util.Arrays;
public class Demo01 {
public static void main(String[] args) {
//Arrays提供排序方法
int[] arr={3,6,1,2,9,7,8,4};
Arrays.sort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
System.out.println("===========================");
//Arrays提供有查找数组元素的索引的方法
//二分查找法,使用前提就是数组里的元素必须是升序
int[] arr2 = {1,2,4,6,7,8,9,45,46,67,87};
int index = Arrays.binarySearch(arr2,9);
System.out.println(index);
System.out.println("===========================");
//Arrays提供有快速查看数组内容的方法
System.out.println(Arrays.toString(arr));
}
}
三、异常的概述
(一)异常的概述
异常就是程序出现了不正常的情况,在程序执行过程中,出现的非正常的情况,最终会导致程序非正常停止。
需要注意:语法错误不算在异常体系中。
(二)异常体系结构
1.异常体系结构图
在java中异常使用类进行描述,(每一个异常类都描述一种非正常的情况)使用的时候使用类的对象来体现具体的异常。java的异常体系其实就是类的体系关系网。
java大部分的异常jdk已经给描述好了,可以直接拿来实例化使用(jvm会将异常封装一个对象给程序员抛出来)。只有特殊的情况下可以认为自定义异常类,供自己或他人使用。
(三)编译时异常和运行时异常的区别
1.编译时异常
①Exception类和Exception除了RuntimeException以外的其他子类(编译的时候产生不正常现象)
②出现就必须显示(写代码)的处理,否则程序无法编译通过,程序也就无法运行(编译异常必须处理)
2.运行时异常
①RuntimeException类和RuntimeException的子类(运行时才会产生不正常现象)
②出现运行时异常无需显示处理,也可以像编译时异常一样显示(写代码)处理,无论是否处理程序都可以编译通过
3.两种异常区别图示:
(三)异常处理方式
1.概述
程序员对代码产生的异常进行处理时,使用的手段就叫做异常的处理。
处理的手段不是单一的。
2.分类
①捕获式处理异常:使用特殊的格式把具体的异常捕获到,把异常处理点的方式;特点:程序运行时如果真的出现异常了还能继续运行。
②声明式处理异常:不适用代码捕获具体的异常,使用声明方式告诉下一个使用者有异常你要处理,特点:程序运行时如果真的出现异常了,程序停止,无法继续向下执行。
3.捕获处理
①try...catch
try{
可能有异常的代码1
可能有异常的代码2
可能有异常的代码3
}catch(异常类型 变量){
处理具体异常的方案
}
格式解释:
只能捕获处理一个异常
try:尝试,尝试的诊断有可能产生异常的代码
catch:捕获,try当中的代码哪里产生了异常到哪里捕获具体的异常对象到异常变量中
处理方案:当捕获到具体的异常时要去执行的代码
执行流程:
执行诊断try中有可能发生异常的代码
没有异常,跳过catch以及异常方案,继续执行后续代码
有异常产生:
catch到有异常的部位捕获具体的异常对象回处理方案
执行处理方案之后跳出try...catch继续执行后续代码
public class Demo01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = {1,2,3,4,5,6};
try{
System.out.println(arr[10]);//下标越界
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("输入有误!");
}
System.out.println("结束");
}
}
注意:
catch准备的接收具体异常对象的容器,类型可以是异常对象类型以及他的父类类型,原理(多态)
②try...catch...catch
在一段代码中,可能出现多种异常(虽然一次只能出现一个,但是出现那个异常我们不是很清楚)所以要准备多种异常情况的处理机制。
格式:
try{
可能有异常的代码1
可能有异常的代码2
可能有异常的代码3
}catch(异常类型1 变量1){
处理具体异常的方案
}catch(异常类型2 变量2){
处理具体异常的方案
}
........
还可以更多
执行流程和第一种相似。
注意事项:
多异常有可能同时发生的时候,捕获的时候只捕获第一个发生的异常
及时写了多个catch语句,但是也有产生的异常不能捕获,如果出现了,程序依然会停止
多个catch块中的异常变量类型如果没有继承关系,顺序随意书写,如果有继承关系,父类必须写在前面
代码示例:
public class Demo02 {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
arr=null;
try {
System.out.println(arr.length);
System.out.println(arr[10]);
//System.out.println(1 / 0);
}catch (NullPointerException e){
System.out.println("空指针异常");
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("越界异常");
}
System.out.println("结束");
}
}
③try...catch...finally
格式:
try{
可能出现异常的代码
}catch(异常类型1 变量1){
处理具体异常的方案
}catch(异常类型2 变量2){
处理具体异常的方案
}finally{
无论发生什么异常都必须执行的代码
}
特点:
处理异常的基础上增加对必须要执行的代码的处理
finally中代码无论是否有异常发生都要执行,必须借助捕获处理格式
try中有异常产生,catch没有捕获到,finally也会执行
代码示例:
public class Demo03 {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
arr=null;
try {
System.out.println(arr.length);
System.out.println(arr[10]);
//System.out.println(1 / 0);
}catch (NullPointerException e){
System.out.println("空指针异常");
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("越界异常");
}finally {
System.out.println("总会执行");
}
System.out.println("结束");
}
}
④try...finally
格式:
try{
可能发生异常的代码段
}finally{
必须要执行的代码
}
执行特点:
先执行try中代码
public class Demo04 {
public static void main(String[] args) {
int[] arr = {1,2,3};
try{
System.out.println(arr[10]);
}finally {
System.out.println("一定执行");
}
System.out.println("结束");
}
}
4.声明处理:throws
概述:
遇到异常自己不做具体的处理方案,使用关键字throws把异常的类型声明出去,声明给下一个使用该方法的元素
声明式异常处理:常用于来处理编译时异常,运行时异常使用它处理不处理没有变化
方式:
在方法的参数列表后使用throws+异常的类型1,异常的类型2,异常的类型3...
虽然处理异常比较简单,缺点:出现异常程序会非正常停止,导致后面的代码无法执行,如果以后咱们想出了问题还能继续执行就不用throws ,而是用try...catch
代码示例:
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class Demo06 {
public static void main(String[] args) throws ParseException{
test();
test2();
}
public static void test() throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.parse("21-2-2");
}
public static void test2() throws NullPointerException{
String s="123";
System.out.println(s.length());
}
}
(四)throw关键字
概述
throw是一个关键字,抛出的意思,自己new了一个具体的异常对象的时候,用来抛出该异常对象的一个关键字,使用在方法体中,也就是使用throw就可以自己抛出异常对象了。
作用
抛出具体的异常对象爱
抛出的事运行时异常对象,可处理可不处理
抛出的事编译时异常时,必须处理
代码示例:
public class Demo08 {
public static void main(String[] args) throws Exception{
int[] arr = {1,2,3};
show(arr,3);
test(arr);
}
public static void show(int[] arr,int i){
if(i < 0 || i>=arr.length){
throw new ArrayIndexOutOfBoundsException("越界异常");
}
System.out.println(arr[i]);
}
public static void test(int[] arr) throws Exception{
if (arr==null){
throw new Exception("编译异常");
}
System.out.println(arr.length);
}
}
5.throw和throws的区别