复习
1.String类
1.转换方法
getBytes() toCharArray()…
2.其他方法
trim() split()
2.字符串缓冲区对象
StringBuffer/StringBuilder
可变的字符序列。
append、insert、delete、replace、reverse、length()
字符串缓冲区对象和String对象的互转。
3.包装类
一共有8个,final类。
Integer:
构造方法:
new Integer(int)
new Integer(String)
方法:
intValue()
static parseInt(String)
十进制与其他进制间的转换。
自动装箱和拆箱:
Integer in = 123;
int num = in;
与基本类型和String间的转换:
包装类<--->基本类型 包装类<--->String 基本类型<--->String
课程
一. Math
1、两个常量
E:自然对数的底数,2.718
PI:圆周率
2、常用方法
abs(数字类型),返回该参数的绝对值
ceil(double d),返回d的向上取整
floor(double d),返回d的向下取整
max(int a, int b),返回a、b的较大值
min(int a, int ),返回a、b的较小值
pow(int a, int b),返回a的b次幂
random(),返回0.000~0.999的随机数
round(double d),返回d四舍五入的结果
import java.util.Random;
public class Demo1 {
public static void main(String[] args) {
//常量
System.out.println(Math.PI);
System.out.println(Math.E);
//方法:
//取绝对值 参数类型:int long float double 返回值类型:int long float double
System.out.println(Math.abs(-8));
//开立方根 参数类型:double 返回值类型:double
System.out.println(Math.cbrt(27));
//获取大于参数的最小整数 参数类型:double 返回值类型:double
System.out.println(Math.ceil(3.4));
//获取小于参数的最大整数 参数类型:double 返回值类型:double
System.out.println(Math.floor(3.4));
//获取两个数中的大值 参数类型:int long float double 返回值类型:int long float double
System.out.println(Math.max(4,5));
//获取两个数中的小值 参数类型:int long float double 返回值类型:int long float double
System.out.println(Math.min(4,5));
//计算参数1的参数2的次幂 参数类型:double 返回值类型:double
System.out.println(Math.pow(2,3));
//四舍五入 参数类型 :double 、float 返回值类型:long int
System.out.println(Math.round(4.16));
//开平方根 参数类型:double 返回值类型:double
System.out.println(Math.sqrt(4));
//获取随机数
System.out.println((int)(Math.random()*10+1)); //double [0.0,1.0)
//随机数生成器
Random ran = new Random();
System.out.println(ran.nextDouble()) ; //该方法与 math.random 方法结果是相同的,返回:double [0.0,1.0)
System.out.println(ran.nextInt()); //返回 int范围内的某一个值
System.out.println(ran.nextInt(5)); //返回 [0,5)区间内的一个整数
}
}
/*
* java.lang.Math:
* 数学类,是一个final,类中封装了常规的数学计算。
* 类中的成员都是静态的,不需要创建对象。
* */
二. System类及其常用方法
1、用于描述系统资源的类型,System是一个和系统相关的类,里面提供了一些系统常用的方法,例如调用垃圾回收机制,给出系统时间,关闭虚拟机等。该类不用创建对象,因为构造方法私有, 直接使用静态变量和静态方法即可
2、常用字段(静态常量):
System.in:标准输入流,默认关联到键盘上
举例 : Scanner sc = new Scanner(System.in);
System.out:标准输出流,默认关联到控制台上
举例 : System.out.println(数据);
System.err:标准错误输出流,默认关联到控制台上,用于打印错误信息,使用该流打印的内容是红色
举例 : 如果代码中发生异常, JVM即使用System.err将异常信息进行输出
3、常用方法全部都是static修饰:
(1) currentTimeMillis():
返回当前时间的毫秒值,表示的是从1970年1月1日0时0分0秒开始到现在经历的毫秒值,1s = 1000ms。
应用:1、可以通过某些手段,将数字转换成时间对象、指定格式的字符串;2、可以通过计算两次的差值,来获取某段代码运行的时间
(2) static void exit(int status): 退出JVM虚拟机,参数0表示正常终止
import java.util.Properties;
public class Demo3 {
public static void main(String[] args) {
//属性
System.out.println("标准输出流");
System.err.println("标准错误输出流");
//方法:
System.exit(0); //jvm退出,参数:通常写0,代表正常退出。非0数字代表异常退出。
//获取当前系统时间毫秒值 1秒=1000毫秒
//起始之间:1970年 1月1日 0:0:0
long times = System.currentTimeMillis();
System.out.println(times);
//获取系统信息, 存储到属性集信息对象中。property
Properties properties = System.getProperties();
properties.list(System.out);
}
}
/*
* System:
* 系统类,final类,java.lang包。
* 类中的成员都是 静态的,因此不需要创建对象,直接类名访问。
*
* 属性:
* in: 标准的输入流(数据),默认设备:键盘
* out:标准的输出流(数据): 默认设备:控制台窗口
* err: 标准的错误输出流(数据): 默认设备:控制台窗口,输出数据时位置不固定。
* */
三. 时间类
(一) 日期Date类型及其常用方法
-
概述: Date表示特定的瞬间,精确到毫秒.是java中提供的表示时间日期数据的对象,但是这个类,其中大部分的方法已经过时,由Calendar和DateFormat类代替.
-
Date类构造方法:
- public Date(): 分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒)
- public Date(long date): 分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为"历元(epoch)",即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数
-
Date类常用方法
- long getTime():
返回自1970 年1月1日 00:00:00 GMT 以来此 Date 对象表示的毫秒数 - void setTime(long time)
设置此Date对象,以表示 1970 年1月1日 00:00:00 GMT 以后 time 毫秒的对应时间点
- long getTime():
import java.util.Date;
public class Demo4 {
public static void main(String[] args) {
//创建日期对象
Date date = new Date();
System.out.println(date.toString()); //Thu Aug 18 11:29:34 CST 2022 当前系统时间值
Date date1 = new Date(System.currentTimeMillis()); //参数:毫秒值,将毫秒值转为Date对象。
System.out.println(date1);
//方法:
//获取系统时间毫秒值
long time = new Date().getTime();
System.out.println(time);
//根据毫秒值设置date对象
Date d = new Date();
d.setTime(1660793674152L);
System.out.println(d);
}
}
/*
* 日期对象:
* java.util.Date。
* 表示特定的瞬间,可以精确到毫秒。
* */
(二) SimpleDateFormat类及其常用方法
-
概述:简单的日期格式化类,提供了日期的格式化的方法
-
SimpleDateFormat类常用构造方法
- SimpleDateFormat(): 用默认的模式和默认语言环境的日期格式创建对象
- SimpleDateFormat(String pattern)
用给定的模式和默认语言环境的日期格式创建对象,
一般pattern传递的是 “yyyy-MM-dd HH:mm:ss”
例如:2021-03-02 16:48:22
-
SimpleDateFormat类常用方法
- final String format(Date date): 将一个 Date 格式化为日期/时间字符串
- Date parse(String source) throws ParseException: 从给定字符串解析文本,以生成一个日期
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo5 {
public static void main(String[] args) {
Date date = new Date();
DateFormat df = DateFormat.getInstance();//22-8-18 下午2:03
DateFormat df = DateFormat.getDateInstance(); //2022-8-18
DateFormat df = DateFormat.getDateTimeInstance(); //2022-8-18 14:02:59
String time = df.format(date);
System.out.println(time);
//日期格式化 api有对应的表格
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
String time = sdf.format(date); //日期对象转为文本格式
System.out.println(time);
//文本格式的字符串 ----日期对象
String str = "2020年08月18日 02:09:20";
//注意:文本内容格式 与 模式的格式要匹配,否则出异常。
try {
Date d = sdf.parse(str);
System.out.println(d);
} catch (ParseException e) {
System.out.println("文本格式不正确");
}
System.out.println(args[0]);
}
}
/*
* 日期格式化对象:
* Date默认给定的日期格式不方便阅读,因此可以自己指定想要的日期格式。
* java.text.DateFormat
* 该类中提供了format方法,用于将日期进行格式化。
* 该类是一个抽象类,不可以直接new,类中提供了静态方法用于获取该类的实例对象:
* getInstance()/getDateInstance()/getDateTimeInstance()...
* 该类有一个子类,SimpleDateFormat,可以指定日期格式。
*
*
* */
import java.util.Calendar;
import java.util.Date;
public class Demo6 {
public static void main(String[] args) {
//获取日历对象
Calendar c = Calendar.getInstance();
System.out.println(c);
//获取指定字段信息
int year = c.get(Calendar.YEAR);
int y = c.get(1);
System.out.println(year+"...."+y);
//注意:month的值是:0-11,因此需要手动+1.
int month = c.get(Calendar.MONTH);
System.out.println(month);
int hour = c.get(Calendar.HOUR_OF_DAY); //小时,24小时制
System.out.println(hour);
System.out.println("-----------------------------------");
//获取毫秒值
long times = c.getTimeInMillis();
System.out.println(times);
//根据毫秒值,设置日历对象
c.setTimeInMillis(times);
System.out.println(c);
System.out.println("------------------------------------");
//日期对象 和 日历对象可以互转
Date date = c.getTime(); //日历--->日期
c.setTime(date); // 日期--->日历
}
}
/*
* 日历对象:
* Calendar:
* java.util包中的一员。
* 该类是一个抽象类,不可以直接new,类中提供了 getInstance()方法,用于获取该类的实例对象。
* */
四.异常
(一)异常的概述
- 异常概述: 在java程序运行过程中,出现的不正常情况,出现的错误,称为异常。
- Java中的每一种异常都封装成一个类, 当异常发生时创建出异常对象,对象中包含了异常情况的原因、类型、描述以及位置。
- 异常也是一种处理异常情况的机制,可以进行跳转、捕获以及结束程序。
(二)异常的体系
1、Throwable:可抛出的,是异常体系的顶层父类,其他的异常或者错误都是Throwable的子类类型,只有Throwable的体系类型,才可以使用异常的处理机制
2、Error:错误,是Throwable的子类,用于描述那些无法捕获和处理的错误情况,属于非常严重的错误,StackOverflowError
3、Exception:异常,是Throwable的子类,用于描述那些可以捕获和处理的例外情况,属于不太严重的错误,ArrayIndexOutOfBoundsException
4、RuntimeException:运行时异常,是Exception的特殊的子类,在编译阶段不做检查的一个异常
5、异常体系结构:
Throwable
Error
Exception
RuntimeException : 运行时异常
除RuntimeException 之外: 编译时期异常
(三)在jvm中默认处理异常的机制
1、在代码的某个位置,出现了和正常情况不同的情况,就将异常情况封装到一个异常对象中。
2、将异常对象抛给调用该方法的方法
3、某个方法接收到底层方法抛上来的异常,也没有办法自己处理,继续向上抛出,最终抛给主方法,主方法也没有办法处理,抛给调用自己的jvm虚拟机
4、jvm虚拟机是我们手动调用的,只能将异常对象的所有信息,通过错误流打印出来,结束jvm虚拟机
5、总结,jvm默认处理的方式:【一层一层向上抛,jvm接收到之后结束自己】
(四)手动处理异常的方式
1、有两大类处理异常的方式:
异常的声明:某个方法有编译时异常,编译就会无法通过,需要在异常所在的方法声明上,声明该方法可能出现的编译时异常
异常的处理:出现异常之后,可以通过某些格式来捕获和处理异常,可以让程序在出现异常之后,继续运行。可以定义自己处理异常的逻辑。
2、捕获处理异常的代码格式:
try…catch
try…catch…finally
try…finally(无法捕获处理异常)
(五)try…catch语句
1、格式:
try {
可能发生异常的代码
} catch(可能出现异常的类型 标识符) {
这种异常出现之后的处理方式
}
2、try:关键字, 试一试
try语句块中,是可能会运行失败的代码,try语句是用于对异常进行检测
3、catch:关键字, 捕获
抓住try语句中出现的异常,并且定义异常处理的方式
小括号中声明可能出现的异常类型,标识符就是一个引用,指向了将来出现的异常对象
大括号中用于定义异常出现之后的处理方式:可以是记录日志、可以是反复运行、可能是把异常封装进新的异常,进行抛出
4、运行机制:
- 运行try语句中的代码
- 如果没有发生任何异常,那么不再运行catch块中的内容
- 如果发生了catch中声明的异常,那么就会被捕获到这个异常,执行catch块中的内容(try中如果发生了异常,try中,该语句后面的代码都无法执行了,直接跳到catch中)
- 如果发生了catch中没有声明的异常,那么就无法捕获该异常,该异常的处理就使用jvm的默认处理方式
(六)try…catch…catch…语句
1、在一段代码中,可能出现多种异常(虽然一次运行只能出现一个异常,但是出现哪个异常我们是不清楚的),所以要准备多种异常情况的处理机制。
2、格式:
try {
可能出现异常的代码
} catch (异常类型1 异常对象名1) {
异常类型1出现之后的处理办法
} catch (异常类型2 异常对象名2) {
异常类型2出现之后的处理办法
}
....
} catch (异常类型n 异常对象名n) {
异常类型n出现之后的处理办法
}
3、执行流程:
- 执行try中的内容,如果没有异常,try…catch语句直接结束
- 如果有异常,那么就在发生异常的代码位置直接跳转到catch块中,try中后面的代码就不再继续运行了
- 继续匹配各个catch块中的异常类型,从上到下,一旦匹配到某个catch声明的异常类型,就直接执行该catch块的处理方式。处理完成之后,try…catch语句就直接结束了,不会再去匹配后面其他的catch块的异常类型
4、注意事项:
如果在各个catch块中,出现了子父类的异常类型,那么子类异常的catch块,必须在父类异常catch块的上面,因为从上到下匹配方式,如果父类的catch块在上面,下面的catch块就没有出现的意义了,无法到达的代码。
public class Demo7 {
public static void main(String[] args) {
try {
int a = Integer.parseInt(args[0]); //NumberFormatException
int b = Integer.parseInt(args[1]);//在idea设置vm options中设定数组值
int c = a / b;
System.out.println(c);
}catch (ArrayIndexOutOfBoundsException e){ // e = ArrayIndexOutOfBoundsException
System.out.println("越界异常了");
}catch (NumberFormatException e){
System.out.println("数字格式化异常");
}catch (ArithmeticException e){
System.out.println("除0了");
}catch (Exception e){
System.out.println("出异常了");
}
System.out.println("over");
}
}
(七)try…catch…finally语句
1、格式:
try {
可能发生异常的代码
} catch (可能发生的异常类型 异常对象名称) {
当前异常类型的处理方式
}... finally {
一定要执行的代码
}
2、finally:关键字, 一定要执行的代码
- 如果把某句代码放在try中,可能在这句话前面有异常,那么这句话就无法执行;如果把某句代码放在catch中,有可能try中没有异常,就无法执行这句话;如果把某句代码放在try…catch之后,可能有未捕获的异常,那么这句代码也无法执行。
- finally:也是一个代码块,在这个代码块中的代码,一定会执行,无论上面描述的哪种情况,都会执行。甚至在代码中有return语句,都会先执行finally中的代码。
- 作用:一般使用关闭资源
public class Demo8 {
public static void main(String[] args) {
try {
int a = Integer.parseInt(args[0]); //NumberFormatException
int b = Integer.parseInt(args[1]);
int c = a / b;
System.out.println(c);
}catch (Exception e){ // e = ArrayIndexOutOfBoundsException
System.out.println("出异常了");
// return; //finally也执行
System.exit(0); //finally 不执行 因为jvm直接停了,其他情况都执行
}finally {
//一定会执行的语句块(无论有无异常,都执行),通常用作释放资源
System.out.println("我执行了");
}
/*
该结构出现的目的:就是为了使用finally
try{
}finally {
}*/
System.out.println("over");
}
}
(八)try…finally
1、格式:
try {
可能发生异常的代码
} finally {
一定要执行的代码
}
2、作用:
- 第三种格式无法捕获和处理异常,一旦发生任何异常,仍然会按照默认的处理方式,一层一层向上抛出,到达jvm,结束虚拟机
- 无论try中的语句是否发生异常,finally中的代码都一定有执行的机会
- 如果有两句代码,都需要有执行的机会,不希望第一句的成功与否影响到第二句的执行机会,那么就把这两句代码分别放在try和finally中
3、使用场景 : 如果代码中发生异常, 不处理, 交给JVM默认处理, 还有一定需要执行逻辑, 那么try…finally可以使用
(九)运行时异常和编译时期异常的区别
- 编译时期异常:
a: Exception类和Exception除了RuntimeException以外的其他子类
b: 出现就必须显示的处理,否则程序无法编译通过,程序也就无法运行; 当代码中发生编译时期异常, 提示自动进行处理 - 运行时异常:
a: RuntimeException类和RuntimeException的子类
b: 出现无需显示处理,也可以像编译时一样显示的处理,无论是否处理程序都可以编译通过。
(十)throw关键字
1、throw:抛出,用于抛出一个异常对象
2、throw关键字的使用场景 : 异常是一个对象,当程序运行到某种情况时,程序员认为这种情况和现实生活不符合,就把当前的对于情况的描述,封装到一个异常对象中,通过throw关键字将异常对象进行抛出。将异常抛给方法的调用者
3、throw关键字的语法结构:
throw new Exception或者Exception任意一个子类对象(“将异常发生详细信息描述清楚”);
4、作用:
创建一个异常对象,使用throw关键字抛出,实现了程序的结束或者跳转
5、说明:
(1) 如果抛出的是编译时异常,那么这个异常必须使用异常处理的方式处理,才能编译成功
(2) 如果抛出的是运行时异常,在编译阶段就相当于没有异常,可以不处理这个异常
6、 throw关键字使用注意事项:
(1) throw关键字使用在方法中
(2) throw每一次只能抛出一个异常
public class Demo10 {
public static void main(String[] args) {
try {
int div = div(5, 0);
System.out.println(div);
} catch (Exception e) {
System.out.println("出异常了");
}
}
//封装方法,计算两个整数相除
public static int div(int a, int b)throws Exception{
if(b == 0){
throw new Exception("除数不能为0");
}
int c = a/ b;
return c;
}
}
/*
* throw:
* 用在方法内,主动抛出一个异常对象。
* throw有return的作用,即方法结束,同时将异常对象返回给调用者。
* 抛出的异常对象可以进行处理:
* 1.try/catch
* 2.throws声明
* */
(十一)throws关键字
1、throws:抛出,用于声明异常类型
2、在某个方法中,有一些编译时异常,没有给出处理的方案,没有捕获这个异常,没有处理这个异常,就说明这个方法是一个有问题的方法。为了让调用者在调用时,可以考虑到处理这个异常,所必须在当前方法的声明上,声明这个异常。
3、声明格式:
修饰符 返回值类型 方法名称(参数列表) throws 异常类型1, 异常类型2,... {
可能出现异常的代码;
}
4、注意事项:
(1) 如果抛出的是一个运行时异常,那么就相当于没有抛出异常,这种异常也不需要在方法上声明;声明了一个运行时异常,也相当于没有做任何声明
(2) 如果抛出的是一个编译时异常,那么就必须进行声明或者捕获;如果声明了一个编译时异常,将来调用这个方法时,也相当于有一个声明的异常
public class Demo9 {
public static void main(String[] args) {
try {
int div = div(5, 1);
System.out.println(div);
}catch (Exception e){
System.out.println("出异常了");
}
System.out.println("over");
}
//封装一个方法,用于计算两个整数的商
/*public static int div(int a, int b)throws ArithmeticException{
int c = a / b;
return c;
}*/
public static int div(int a, int b)throws Exception,RuntimeException,NullPointerException{
int c = a / b;
return c;
}
}
/*
* throws:
* 用在方法上,声明异常类型,可以声明多个异常类型,中间用逗号分隔即可。
* 本意:谁调用有throws的方法,谁处理该异常。
* 运行时异常:可以处理也可以不处理
* 编译时异常:必须处理。
* 1.try/catch捕获
* 2.继续向上声明
*
* */
(十二)throw和throws的比较
1、throw是对异常对象的抛出,throws是对异常类型的声明
2、throw是对异常对象实实在在的抛出,一旦使用了throw关键字,就一定有一个异常对象出现;throws是对可能出现的异常类型的声明,即使声明了一些异常类型,在这个方法中,也可以不出现任何异常。
3、throw后面只能跟一个异常对象;throws可以跟很多个异常类型
(十三)异常体系中的常用方法
1、发现在异常的继承体系中,所有的方法定义在了Throwable这个顶层父类中,子类中几乎没有什么特有方法
2、Throwable中的构造方法:
Throwable():创建一个没有任何参数的异常对象
Throwable(String message):创建一个带有指定消息的异常对象
3、常用成员方法:
getMessage():获取异常的详细信息
toString():获取异常对象的详细信息
printStackTrace():打印异常的调用栈轨迹(有关异常的方法调用路径), 对于异常信息追全面的输出方式, 本身返回值结果void, 但是在方法中已经有打印功能, 将异常进行输出,包括异常类型, 异常详细信息, 代码发生异常的行数
public class Demo11 {
public static void main(String[] args) {
try {
int a = Integer.parseInt(args[0]);
System.out.println(a);
} catch (ArrayIndexOutOfBoundsException e) {
// System.out.println(e.getMessage());//返回的异常原因
// System.out.println(e.toString()); //返回的是异常名和原因
e.printStackTrace(); //打印堆栈跟踪信息
//行号 原因 异常名字
// System.out.println(e.getCause());
}
System.out.println("over");
}
}
(十四)异常的注意事项
- 运行时异常抛出可以不处理,既不捕获也不声明抛出; 编译时期异常, 必须进行异常处理,throws声明异常, 或者try…catch语法结构捕获处理异常
- 如果父类方法上抛出了多个编译时异常,子类覆盖(重写)父类的方法时,可以不抛出异常,或者抛出相同的异常,或者父类抛出异常的子类集合。
- 如果父类方法没有异常抛出,子类覆盖父类方法时,不能抛出编译时异常
public class Demo13 extends A {
@Override
public void method()throws RuntimeException{ }
@Override
public void show()throws NullPointerException,ArrayIndexOutOfBoundsException{ }
}
class A{
void method(){}
void show()throws Exception{}
}
(十五)自定义异常
1、jdk中提供了很多的异常类型,其中的绝大部分都没有自己特有的方法,都无法描述当前的异常情况,就需要我们自己定义异常类型,用在自己的项目的业务中。
2、自定义异常的步骤:
(1) 定义一个类,以Exception结尾,IllegleAgeException,表示这是一个非法年龄异常
(2) 让自己定义的这个类,继承一个Exception或者是RuntimeException
如果定义的是编译时异常,就使用Exception
如果定义的是运行时异常,就使用RuntimeException
(3) 构造方法不能被继承,需要手动添加
public class Demo12 {
public static void main(String[] args) {
try {
int div = div(5, -1);
System.out.println(div);
} catch (FuShuNotDivException e) {
System.out.println(e.toString());
}
System.out.println("over");
}
public static int div(int a, int b)throws FuShuNotDivException{
if(b <= 0){
throw new FuShuNotDivException("0和负数都不能作为除数");
}
int c = a/ b;
return c;
}
}
/*
* 自定义异常的步骤:
* 1.定义类继承Exception或RuntimeException
* 2.调用父类的构造方法(可选)
* */
class FuShuNotDivException extends Exception{
public FuShuNotDivException(){
super();
}
public FuShuNotDivException(String msg){
super(msg);
}
}