java第十课

System类

● System类概述

System 类包含一些有用的类字段和方法。它不能被实例化。

● 成员方法

public static void exit(int status)

public static long currentTimeMillis()

1、System.arraycopy(a,b,c,d,e);

​ 其中,a是被复制的数组,b是复制的起始位置,c是复制到的数组,d是复制到这个数组的起始位置,e是复制到这个数组的结束位置。

2、System.currentTimeMillis();

​ 返回毫秒数,这个就比较简单了,和Date类中的getTime方法一样。

3、getProperty获取系统属性

常用的有:

os.arch操作系统的架构
os.version操作系统的版本
file.separator文件分隔符(在 UNIX 系统中是“/”)
path.separator路径分隔符(在 UNIX 系统中是“:”)
line.separator行分隔符(在 UNIX 系统中是“/n”)
user.name用户的账户名称
user.home用户的主目录
user.dir用户的当前工作目录

4、gc

java垃圾回收器,这个方法不需要我们去调用,jvm发现系统有未使用的对象,会自己进行执行。通常会有两种情况下会调用gc:a、当jvm内存不足时会调用,b、当cpu空闲的时候调用。详细请看一下jvm的具体的垃圾回收机制。

5、exit

​ 退出虚拟机。exit(int)方法是终止当前正在运行的java虚拟机。参数是状态码。根据惯例,非0的状态码表示异常终止,0表是终止。而且,该方法永远不会正常返回。

public static void main(String[] args) {        
    try {           
        System.out.println("this is try");                   System.exit(0);       
    } catch (Exception e) {            
        // TODO Auto-generated catch block            
        e.printStackTrace();       
    } finally { 
        System.out.println("this is finally");        }     }

这是唯一一个能够退出程序并不执行finally的情况。说明:退出虚拟机会直接终止整个程序,这时的程序已经不是从代码的层面来终止程序,所以finally不会被执行。

Date类/Calendar类/ SimpleDateFormat类

一、 Date类

Date类对象的创建:

1、创建一个当前时间的Date对象

//创建一个代表系统当前日期的Date对象

Date d = new Date();

2、创建一个我们指定的时间的Date对象:

使用带参数的构造方法Date(int year, int month, int day) ,可以构造指定日期的Date类对象,Date类中年份的参数应该是实际需要代表的年份减去1900,实际需要代表的月份减去1以后的值。

//创建一个代表2014年6月12号的Date对象

Date d1 = new Date(2014-1900, 6-1, 12); (注意参数的设置)

3、正确获得一个date对象所包含的信息

如:

​ Date d2 = new Date(2014-1900, 6-1, 12);

​ //获得年份 (注意年份要加上1900,这样才是日期对象d2所代表的年份)

​ int year = d2.getYear() + 1900;

​ //获得月份 (注意月份要加1,这样才是日期对象d2所代表的月份)

​ int month = d2.getMonth() + 1;

​ //获得日期

​ int date = d2.getDate();

​ //获得小时

​ int hour = d2.getHours();//不设置默认为0

​ //获得分钟

​ int minute = d2.getMinutes();

​ //获得秒

​ int second = d2.getSeconds();

//获得星期 (注意:0代表星期日、1代表星期1、2代表星期2,其他的一次类推了)

int day = d2.getDay();

二、Calendar类

​ Calendar类的功能要比Date类强大很多,可以方便的进行日期的计算,获取日期中的信息时考虑了时区等问题。而且在实现方式上也比Date类要复杂一些

1、Calendar类对象的创建

Calendar类是一个抽象类,由于Calendar类是抽象类,且Calendar类的构造方法是protected的,所以无法使用Calendar类的构造方法来创建对象,API中提供了getInstance方法用来创建对象。

2**、创建一个代表系统当前日期的Calendar对象**

Calendar c = Calendar.getInstance();//默认是当前日期

3**、创建一个指定日期的Calendar对象**

使用Calendar类代表特定的时间,需要首先创建一个Calendar的对象,然后再设定该对象中的年月日参数来完成。

//创建一个代表2014年5月9日的Calendar对象

Calendar c1 = Calendar.getInstance();

c1.set(2014, 5 - 1, 9);

//调用:public final void set(int year,int month,int date)

4**、Calendar类对象信息的设置与获得**

1)Calendar类对象信息的设置

A**、Set设置**

​ 如:Calendar c1 = Calendar.getInstance();

​ 调用:public final void set(int year,int month,int date)

c1.set(2014, 6- 1, 9);//把Calendar对象c1的年月日分别设这为:2014、6、9

B**、利用字段类型设置**

如果只设定某个字段,例如日期的值,则可以使用public void set(int field,int value)

//把 c1对象代表的日期设置为10号,其它所有的数值会被重新计算

​ c1.set(Calendar.DATE,10);

//把c1对象代表的年份设置为2014年,其他的所有数值会被重新计算

​ c1.set(Calendar.YEAR,2015);

其他字段属性set的意义以此类推

Calendar类中用一下这些常量表示不同的意义,jdk内的很多类其实都是采用的这种思想

Calendar.YEAR——年份

Calendar.MONTH——月份

Calendar.DATE——日期

Calendar.DAY_OF_MONTH——日期,和上面的字段意义相同

Calendar.HOUR——12小时制的小时

Calendar.HOUR_OF_DAY——24小时制的小时

Calendar.MINUTE——分钟

Calendar.SECOND——秒

Calendar.DAY_OF_WEEK——星期几

C**、Add设置(可用与计算时间)**

Calendar c1 = Calendar.getInstance();

//把c1对象的日期加上10,也就是c1所表的日期的10天后的日期,其它所有的数值会被重新计算

c1.add(Calendar.DATE, 10);

//把c1对象的日期加上-10,也就是c1所表的日期的10天前的日期,其它所有的数值会被重新计算

c1.add(Calendar.DATE, -10);

其他字段属性的add的意义以此类推

2**)、Calendar类对象信息的获得(使用get())**

Calendar c1 = Calendar.getInstance();

// 获得年份

int year = c1.get(Calendar.YEAR);

// 获得月份

int month = c1.get(Calendar.MONTH) + 1;(MONTH+1)

// 获得日期

int date = c1.get(Calendar.DATE);

// 获得小时

int hour = c1.get(Calendar.HOUR_OF_DAY);

// 获得分钟

int minute = c1.get(Calendar.MINUTE);

// 获得秒

int second = c1.get(Calendar.SECOND);

// 获得星期几(注意(这个与Date类是不同的):1代表星期日、2代表星期1、3代表星期二,以此类推)

int day = c1.get(Calendar.DAY_OF_WEEK);

三、 GregorianCalendar类

GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家使用的标准日历系统。

1**、GregorianCalendar类对象的创建**

GregorianCalendar有自己的构造方法,而其父类Calendar没有公开的构造方法。

GregorianCalendar() 在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar。

在具有默认语言环境的默认时区内构造一个带有给定日期设置的 GregorianCalendar。

GregorianCalendar(int year, int month, int dayOfMonth)

GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute) 。

GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute, int second)

2**、创建一个代表当前日期的GregorianCalendar对象**

GregorianCalendar gc = new GregorianCalendar();

//创建一个代表2014年6月19日的GregorianCalendar对象(注意参数设置,与其父类是一样,月份要减去1)

GregorianCalendar gc = new GregorianCalendar(2014,6-1,19);

3**、另外:GregorianCalendar有一个方法:**boolean isLeapYear(int year) 确定给定的年份是否为闰年

四、DateFormat类和SimpleDateFormat类

public class SimpleDateFormat extends DateFormat 是一个以与语言环境相关的方式来格式化和分析日期的具体类。(日期时间输出的工具类)

它允许进行日期格式化(日期 -> 文本)、分析(文本 -> 日期)和规范化。所以SimpleDateFormat类可以实现:String 到 Date,Date到String的互转

五、日期类对象之间的互转

img

/* Date Long Calendar*/

Date类对象与long型时间的互转

//1.将Date类的对象转换为long型时间

Date d= new Date();

//使用对象的getTime()方法完成

long dLong = d.getTime();

//2.将long型时间转换为Date类的对象

long time = 1290876532190L;

//使用Date的构造方法完成

Date d2 = new Date(time);

Calendar对象和long型时间之间的互转

// 将Calendar对象转换为相对时间

Calendar c = Calendar.getInstance();

long t1 = c.getTimeInMillis(); 

// 将long转换为Calendar对象

Calendar c1 = Calendar.getInstance();

long t = 1252785271098L;

c1.setTimeInMillis(t1);

/* String Date Calendar 三者之间的相互转换*/

Calendar对象和Date对象之间的互转

//1 .将Calendar对象转换为Date(c.getTime())

Calendar c = Calendar.getInstance();

Date d = c.getTime();

// 2.将Date转换为Calendar对象(s.setTime(date))

Calendar c1 = Calendar.getInstance();

Date d1 = new Date();

//通过setTime()方法后,日历c1所表示的日期就d1的日期

c1.setTime(d1);

String Calendar之间的转换

//1.Date 转化String

SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");

String dateStr=sdf.format(new Date());

//2.String 转化Date

String str="2010-5-27";

SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");

Date birthday = sdf.parse(str);

Date个Calendar对象之间的转换

//1.Date 转化为Calendar

Calendar calendar = Calendar.getInstance();

calendar.setTime(new Date());

//2.Calenda转换为Date

 Calendar calendar = Calendar.getInstance();

 Date date =calendar.getTime();

Date和String对象之间的转换

//1.Calendar 转化 String

  Calendar calendat = Calendar.getInstance();

  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd")0;

  String dateStr = sdf.format(calendar.getTime());

//2.String 转化Calendar

String str="2010-5-27";

SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");

Date date =sdf.parse(str);

Calendar calendar = Calendar.getInstance();

calendar.setTime(date);

六、利用以上各个类的功能,我们可以很简单的实现一些时间计算的功能,下面看几个方法:

l、判断是否是闰年

​ /**

​ * 给定一个年份判断该年份是否为闰年

​ */

    public static boolean isLeapYear(int year) {GregorianCalendar calendar = new GregorianCalendar();return calendar.isLeapYear(year);}

2、获取当前日期的字符串表示形式

​ /**

​ * 利用SimpleDateFormat获取当前日期的字符串表示形式 格式:2009-5-05

​ */

    public static String getCurrentDate() {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");return dateFormat.format(System.currentTimeMillis());}

3、给出任意一个年月日得到该天是星期几

​ /**

​ * 给出任意一个年月日得到该天是星期几

​ */

    public static int getWeek(String date) {// 注意参数的大小写格式

```java
​        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");Calendar c = Calendar.getInstance();try {Date d = dateFormat.parse(date);

​           c.setTime(d);} catch (ParseException e) {}return c.get(Calendar.DAY_OF_WEEK)-1;}

  

```java

```java
4、 获得今天n天以后或者n天以前是那一天

​    /**

​     \* 获得距离今天n天的那一天的日期

​     */

​    public static String getDistanceDay(int day) {

​       Calendar calen = Calendar.getInstance();

​       calen.add(Calendar.DAY_OF_MONTH, day);

​       Date date = calen.getTime();

​       // 这里也个用SimpleDateFormat的format()进行格式化,然后以字符串形式返回格式化后的date

​       SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

​       return dateFormat.format(date);

}

 

  5、 获得距离指定日期n天的那一天的日期

​    /**

​     \* 获得距离指定日期n天的那一天的日期

​     */

​    public static String getDistanceDay(String date, int day) {

​       SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");

​       Date d;

​       Calendar c =Calendar.getInstance();

​       try {

​           d = dateFormat.parse(date);

​           c.setTime(d);

​           c.add(Calendar.DATE, day);

 

​       } catch (ParseException e) {

​           e.printStackTrace();

​       }

​       return dateFormat.format(c.getTime());

​    }

 

  6、获得给定两个日期相差的天数

​    /**

​     \* 获得给定两个日期相差的天数

​     *

​     */

​    public static long getGapDays(String date1, String date2) {

​       String[] d1 = date1.split("-");

​       String[] d2 = date2.split("-");

​       Calendar c = Calendar.getInstance();

​       c.set(Integer.parseInt(d1[0]), Integer.parseInt(d1[1]), Integer

​              .parseInt(d1[2]), 0, 0, 0);

​       long l1 = c.getTimeInMillis();

​       c.set(Integer.parseInt(d2[0]), Integer.parseInt(d2[1]), Integer

​              .parseInt(d2[2]), 0, 0, 0);

​       long l2 = c.getTimeInMillis();

​       return (Math.abs(l1 - l2) / (24 * 60 * 60 * 1000));

​    }

# BigInteger 

● 在 Java 中,有许多数字处理的类,比如 Integer类,但是Integer类有一定的 

局限性。 

● 我们都知道 Integer 是 Int 的包装类,int 的最大值为 2^31-1。若希望描述 更大的整数数据时,使用Integer 数据类型就无法实现了,所以Java中提供了 BigInteger 类。 

● BigInteger类型的数字范围较Integer,Long类型的数字范围要大得多,它支 持任意精度的整数,也就是说在运算中 BigInteger 类型可以准确地表示任何 大小的整数值而不会丢失任何信息。 

● BigInteger类位于java.math包中 

● 构造方法

BigInteger(String val) /BigInteger(byte[] val) ... 

基本运算方法 

add(),subtract(),multiply(),divide()BigDecimal 

● 在计算机中不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去 一定的精确度。 

● 根本原因是:十进制值通常没有完全相同的二进制表示形式;十进制数的二进制表示形式可 能不精确。只能无限接近于那个值. 

double a = 1.0-0.9; 

double b = 0.8-0.7; 

System.out.println(a==b); // 结果? 

• 但是,在项目中,我们不可能让这种情况出现,特别是金融项目,因为涉及金额的计算 都必须十分精确,你想想,如果你的支付宝账户余额显示193.99999999999998,那是 一种怎么样的体验? 

• Java在java.math包中提供的API类BigDecimal 

• 构造方法

BigDecimal(String val) 

基本运算方法 

add(),subtract(),multiply(),divide()

# **Java** 异常概念

异常:不正常情况

广义上的异常:程序运行时所出现的所有不正常情况
                 错误:程序无法解决的问题(例如 文件读写时文件删除,网路中断,内存不够用了)

狭义上的: 运行时,由于程序缺陷导致在运行时出现不正正常情况,出现后程序可以控制,进行处理,程序继续执行

数组越界,数字格式化,空指针,类类型转换,算数异常.....

程序异常处理方式有:
         虚拟机终止(默认处理方式)

• 异常:在Java语言中,将程序执行中发生的不正常情况称为“异常”。 

• Java程序在执行过程中所发生的异常(运行时一切不正常情况)事件可分 为两类: 

• Error : Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资 源耗尽等严重情况。一般不编写针对性的代码进行处理。 

• Except ion:其它因编程错误或偶然的外在因素导致的一般性问题,可 以使用针对性的代码进行处理。例如:

 访问数组下标越界 

试图读取不存在的文件 

网络连接中断

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KBHAmlVx-1621955451174)(C:\Users\何文强\AppData\Roaming\Typora\typora-user-images\1621954804744.png)]

• 对于这些异常,一般有两种**解决方法**:一是遇到异常就终止程序的运行。 

• 另一种方法是由程序员在编写程序时,就考虑到异常的检测、异常消息 的提示,以及异常的处理。 

• 捕获异常最理想的是在**编译期间**,但有的异常只有在**运行时**才会发生。 

比如:除数为0,数组下标越界等 

分类:编译时异常和运行时异常

**异常的体系** 

● Throwable类有两个直接子类:Exception类、Error类。Error表示错 

误,可能是编译期错误或者系统错误,往往程序中并不处理。 

Exception表示异常,是所有异常类的父类,是程序员所关心的。 

Java.lang.throwable 中包含 Java.lang.Exception 和Java.lang.Error

● 异常分为运行期异常和编译期异常两种 

● 运行期异常:程序运行时抛除的异常,所有RuntimeException的子类都 是运行期异常 

● 数学异常 

● 空指针异常 

● 数组下标越界 

● ……

 ● 编译期异常(Checked Exception):除去运行期的异常都是编译期异常, 也称为检测异常 

● IOException 

● SQLException 

● ……

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Wdwl0ln-1621955451176)(C:\Users\何文强\AppData\Roaming\Typora\typora-user-images\1621955044236.png)]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值