Java基础知识整理 (Date类,Calender类,枚举,异常,throw和throws抛出异常)

常量在编译时期就能确定其值(需要声明的同时赋值)

变量在编译时期不能确定其值,只能在运行时才可以

System.in 标准输入流 System.out标准输出流

arraycopy——赋值数组 复制原数组指定位置的元素,到目标数组中的指定位置指定复制长度

ArrayList—扩容就是使用arraycopy完成

Date类

Date是一个时间类,JDK1.0就存在,JDK1.1中就不提倡使用,在包java.util.date中。

Java提供一种机制:方法过时机制(废弃),提示编程者当前不再提供维护,在以后的版本里面有可能删除删除当前方法,所以不建议使用过时方法 ——但是date类一直在用

@Deprecated——让方法显示过时,平时自己写的方法也是可以用

Date类可以表示一个特定瞬间,精确到毫秒,

DateFormat/SimpleDateFormat类—时间格式化

Date date = new Date();
显示声明当前类属于那个包  java.util.Date date1 = new java.util.Date();

date.getTime();返回值long 返回197011日距离当前日期的毫秒值


DateFormat格式化类

格式化返回的String类型

Date date = new Date();
DateFormat df = DateFormat.getInstance;//时间风格 SHORT风格
String time = df.format(date);

长风格的时间格式化 修改df对象引用
df = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
String time = df.format(date);

解析时间 String类型转换成Date对象

解析时要注意时间格式要对应,使用哪种形式的格式化时间,就需要使用哪种方式解析

(当时长风格就要时,要先转成短风格再转成Date)
df = DateFormat.getInstance();
Date date2 = df.parse(time);//从String到Date

DateFormat的格式是固定的,不能自定义

SimpleDateFormat日期格式化

当前类是DateFormat的子类,支持自定义时间

//自定义时间格式
String str = "yyyy/mm/dd hh时mm分ss秒";
SimpleDateFormat sdf = new SimpleDateFormat();
//设置使用时间格式
sdf.applyPattern(str);//设置时间格式
//SimpleDateFormat sdf = new SimpleDateFormat("yyyy/mm/dd hh时mm分ss秒");两部合成一步

String time = sdf.format(new date());

在这里插入图片描述

若使用当前格式格式化当前时间 ,必须要用这种格式格式化回来

Date date2 = sdf.parse(time);//从String到Date

Calender类

Calender类代替Date出现,并且是一个抽象类不能new。使用getInstance()获取对象

Calender可以获取当前系统所在时区的日历对象,通过对这个日历对象获取时间

//获取日历类对象
Calendar c = Calender.getInstance();
//在日历类中获取有用数据 使用静态常量获取
//get()-通过参数获取日历类对象中储存的数据
int year = c.get(Calendar.YEAR);
//表示月份很特殊,从0开始11结束 需要进行+1操作
int month = c.get(Calendar.MONTH)+1;
//天数 时分秒
int day = c.get(Calendar.DATE);
int h = c.get(Calendar.HOUR);
int m = c.get(Calendar.MINUTE);
int s = c.get(Calendar.SECOND);
Calendar 转化成Date对象
Calendar c = Calender.getInstance();
Date time = c.getTime();
// 获取2019年4月12日是这一年的第几天(考虑到平年闰年),一周中的第几天,一个月的第几天
Calendar c = Calendar.getInstance();
		c.set(2019, 3, 12);//月份要减一
		//当年对应天数
		int day = c.get(Calendar.DAY_OF_YEAR);
		//一周中第几天
		int week = c.get(Calendar.DAY_OF_WEEK);
		//一个月中的第几天
		int dayForMonth = c.get(Calendar.DAY_OF_MONTH);
		System.out.println(day + " " + week + " " +dayForMonth);

枚举

枚举是一种类型——枚举中存储的是常量—静态常量

用来表述一些使用变量无法描述的事物-----例如春夏秋冬

枚举只能获取枚举存储的类型,不能获取其他类

//那一天可以休息
Person p = new Person();
p.setDay(3);
if(p.getDay()==6 || p.getDay()==7){
    //可以休息
}else{
    //在上班
}
getDay方法里面的参数是没有什么限制的,可以传负数,大于7的数,出现1-7以外的值,表述不明确,不知道1代表什么

根据上述问题 需要语意明确,又传值清晰

public class week{
     /*
      public static final int MONDAY = 1;
      public static final int TUESDAR = 2;
      public static final int WEDNESDAY = 3;
      public static final int THURSDAY = 4;
      public static final int FRIDAY = 5;
      public static final int SATURDSAY = 6;
      public static final int SUNDAY = 7;
      */
      private Week(){}
      public static final Week MONDAY = new week();
      public static final Week TUESDAR = new week();
      public static final Week WEDNESDAY = new week();
      public static final Week THURSDAY = new week();
      public static final Week FRIDAY = new week();
      public static final Week SATURDSAY = new week();
      public static final Week SUNDAY = new week();
}

上述代码还是很繁琐的,JDK1.5开始系统提供了Enum枚举类型来完成

枚举是一个应用类型

public enum Week{
    //定义常量
     MONDAY,TUESDAR,WEDNESDAY,THURSDAY,FRIDAY,SATURDSAY,SUNDAY
}

语法: 权限修饰符 enum 枚举类名{常量} (多个常量用逗号隔开)

1.枚举是继承与Enum存在的

2.底层是一个类,所以枚举可以定义成员变量、成员方法、静态方法、静态变量的

3.因为默认私有构造方法,枚举本事是一个单例

4.枚举只能获取枚举常量值,不能通过new创建对象

5.若需要枚举中的常量值 用 枚举名.常量名 即可

6通过反编译,发现一个隐藏方法,系统API中没有,values

枚举扩展
枚举本身就是一个类,一个单例,枚举单例定义
访问权限修饰符 enum 枚举名{
      需要定义使用的名称(枚举常量)
}
public enum Type{
     INSTANCE;
     Sting name;
     public String getName{
        return name;
     }
}
一旦枚举中提供了属性和方法,枚举常量必须用分号 ;结尾
枚举中声明多个常量,所有的常量都共享属性和方法
public enum Type{
       INSTANCEA{//当前范围内的都属于A,B获取不到
            String name;
            public String getName{
               return name;
            }
       }
       INSTANCEB;
}枚举实现接口,但是不能继承

枚举和Switch最配 JDK1.7之后提供了Switch和String的搭配,所以枚举用的少了

只是用String限制数据问题不能解决

异常

java中有一个异常和错误的父类 ——-Throwable
image

Error(错误) 一般是指JVM出现不可修复的问题,此时异常退出JVM情况

如:内存溢出,堆溢出(OOM) ,JVM崩溃

出现描述的时候 xxxxError,其中Error作为结尾出现

Exception(异常): 当前程序出现不正常情况,出现异常信息,提示异常信息进行修改,所有异常又是Exception作为结尾

两种异常:

1.编译时异常(必须处理):在编写代码时就出现的异常提示

2.运行时异常:当程序运行起来后出现的异常信息,出现后修改,若能发现及时修改(RuntimeException)

常见的异常

NullPointerException 空指针异常 引用了一个地址是null对象并调用了自身

ArrayIndexOutOfBoundsException 数组下标越界异常 下标越界

NumberFormatException 数据格式化异常 将数据格式化的时候出现的问题

ClassCastException 强制类型转换异常 将一个父类的引用类型转换为其子类时,当前子类与对象原有类型不匹配

ArithenmticException 算数异常 除数为0

try….catch….finally

保证代码的正常运行

try{
    //可能出现的异常代码
}catch(ArithenmticException e){
    //对异常进行处理 打印信息
    1.直接打印提示信息System.out.println("出现了异常")
    2.异常类型后面的e相当于异常对象,所以对e进行操作,
        打印错信息:用e.getMessage();
        打印异常类型和异常信息:e.toString();
        打印异常跟踪栈信息:e.printStackTrace();//
}
出现多个异常时的抓取方式 try-catch多个

注意:父类异常不能在子类异常上一个catch中,因为父类异常会将所有异常抓取走,剩余的异常信息抓起不会执行

try{
//可能出现的异常代码
}catch(ArithenmticException e){
//对异常进行处理 打印信息

}catch(ArrayIndexOutOfBoundsException e){

}catch(Exception e){//父类异常
}
JDK1.7推出了一个平行异常(平行抓去)

父类异常不能在子类异常之前

try{
//可能出现的异常代码
}catch( ArrayIndexOutOfBoundsException|ArithenmticException|Exception e){
//对异常进行处理 打印信息

}

代码中有多个异常,但是不知道异常有哪些,直接用Exception万能抓取方式

finally代码块

特点:finall语句快表达式最终都会被执行,无论是否出现异常当前的finally一定会执行

可以添加到catch的后面,可以进行一些资源的释放工作

当使用try捕捉异常时,

语法:可以跟try catch联用,也可单独和try一起使用
try{
//可能出现的异常代码
}catch( ArrayIndexOutOfBoundsException|ArithenmticException|Exception e){
//对异常进行处理 打印信息
}finally{
//释放资源
}

try{
//可能出现的异常代码
}finally{
//释放资源
}

只要finally语句块中有return语句,永远执行finally里面的return

final finally finalize之间有什么区别

throw和throws抛出异常

throw抛出异常 运用在方法体的内部类,抛出一个具体的异常对象

throw new 异常类(“异常信息”);

这个throw在方法体中,相当于是一个return关键字,可以终止方法

1.当前需要返回值,素有情况都满足了,但是有一种特殊情况,此时可以抛出异常

例如:工厂方法
public static Person createPerson(String gender){
    switch(gender){
        case man:
            return new man();
        case woman:
            return new woman();
        default:
            //这里可以返回null,但是使用的时候需要加判断,不然会有空指针异常
            //所以最好的方式应该是抛出异常
            throw new RuntimeException("没有这个性别,确定后输入");
    }
}

2.当前方法中会出现异常,但是方法处理异常时机不是很好,此时可以将异常再次抛出

String str = "123";
try{
    int num = getNumber(str);
    System.out.println(num);    
}catch{
    System.out.println(e.getMessage());
}

public static int getNumber(String str){
    try{
        return new Integer(str).intValue;
    }catch(NumberFormatException e){
        throw new NumberFormatException("大哥您输入的字符串有问题");
    }
}
throws

用于方法的声明之上,throws和throw完全不一样。作用于方法之上,将整个方法出现的异常抛给调用者.最终throws会抛到main方法上,main方法对异常进行抛出—JVM接受 —崩溃

throws只能抛出异常,不能处理异常

public static int getNumber(String str)throws NumberFormatException{
    return new Integer(str).intValue;
}

throw和throws不一起使用,但是有一种特殊情况 ,当方法中抛出的异常时编译时异常时,此时需要同时使用,此时也可以单独只使用throws,直接抛出一个编译时异常即可

public static int getNumber(String str)throws(Exception e){
    try{
        return new Integer(str).intValue;
    }catch(ception e){
        throw new Exception("大哥您输入的字符串有问题");//
    }
}

自定义异常:

java中有很多异常类,这些异常类都是一些具体的作用与说明

1.当前自定义异常定义的是运行时异常———只需要继承与RuntimeException即可仿父类生成构造方法

2.当前自定义异常定义的是编译时异常———只需要继承Exception即可并仿照生成自己的构造方法

package com.qfedu.Exception;
//自定义异常
public class ZhangPangLeExcetpion extends RuntimeException{
/** *就是区分JDK版本使用 */
    private static final long serialVersionUID = 1L;
//只要仿照构造方法,什么都需要写
    public ZhangPangLeExcetpion() {
    super();
            // TODO Auto-generated constructor stub
    }
    public ZhangPangLeExcetpion(String message, Throwable cause, boolean enableSuppression,
            boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
        // TODO Auto-generated constructor stub
    }
    public ZhangPangLeExcetpion(String message, Throwable cause) {
        super(message, cause);
        // TODO Auto-generated constructor stub
    }
    public ZhangPangLeExcetpion(String message) {
        super(message);
// TODO Auto-generated constructor stub
        }
    public ZhangPangLeExcetpion(Throwable cause) {
        super(cause);
        // TODO Auto-generated constructor stub
} }
package com.qfedu.Exception;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
    Scanner input = new Scanner(System.in); 
    System.out.println("请输入你今天的体重:"); 
    double d = input.nextDouble(); checkPang(d);
    }
    public static void checkPang(double d) {
        if(d > 100) {
            throw new ZhangPangLeExcetpion("恭喜胖了!!!!请继续加油!!!!");
        }
    }
}

异常链和异常转换

异常转换:当位于最上层的调用代码时,不需要关系底层代码的异常细节,可以将原始异常进行一次转换

异常链: 把原始异常记性一次包装会的得到一个新的异常,并给此后都会对新的异常进行包装,可以得到一个有序的排序,这个排序就是异常链在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/root1994/article/details/89254599