异常
描述:程序出现了问题;程序一旦遇到异常,后面代码无法正常执行,并且同时控制台中展示异常的详细信息|细节问题,便于程序猿的调试
1. 异常体系
异常体系:都是类,所以首字母需要大写
Throwable(父类)
/
Error Exception(子类)
Error(错误):一般指由虚拟机生成并脱出的,无需程序猿解决处理
Exception(异常):阻碍程序的正常运行,异常如果不处理,程序无法正常执行,需要程序猿在代码层面上处理异常
2. 异常的分类
- RuntimeException:运行时异常:运行期间才会发生的异常
- CheckedException 编译时异常|检查时异常 : 编译期间发生的异常,不处理程序无法运行
3. *异常处理方案
所有的异常都可以通过异常处理方案来处理
运行时异常:一般通过增强程序健壮性的代码就可以解决 -> 即if判断;也可以通过异常处理方案来处理
编译时异常:只能通过异常处理方案来处理
1)异常处理方案
- 异常抛出(throws):将异常抛出到上一层,谁调用谁处理
- 异常捕获(try-catch):异常对象当前抓住,直接处理
2)try-catch语句
try {
可能会出现异常的代码;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
} catch (Exception e) { --> 接盘侠
System.out.println("出现了文件未找到异常, 捕获异常...");
e.printStackTrace();
}finally{
无论try中是否会出现异常,最终都会执行的代码
}
3)注意
1.异常一旦处理,不影响程序的继续执行
2.try中代码可能出现异常,可能不会出现异常 如果没有出现异常,try{}中的代码执行完毕,try…catch结束
try中代码一旦异常,try后面的代码不会执行,直接执行catch的判断 从上到下一次判断,判断当前的catch是否能够捕获出现的异常对象,如果能,执行后面 的{}中的代码
如果不能匹配,继续向下判断,如果所有的都不鞥匹配,当前的异常对象没有处理,中止 程序的执行
3.一个try后面可以跟1~n个catch
4.如果一个异常已经通过catch处理不影响后面代码的执行
5.接收范围较大的异常的catch,需要定义在后面
6.finally 最终的
无论try中是否会出现异常,finally中的代码肯定最后会执行
一般会定义一些资源的关闭等代码
4. 常见的运行异常
NullPointerException 空指针异常
ArithmeticException 数学异常
ArrayIndexOutOfBoundsException 数组索引越界异常
NegativeArraySizeException 数组长度负数异常
ClassCastException 类型转换异常
NumberFormatException 转换格式异常
5.自定义异常
异常也是类,需要遵守类的规则与规范
需要直接或者间接的继承Exception类;如果是运行时期异常必须直接或者间接的继承RuntimeException
自定义异常:
class NameException extends Exception{
public NameException(){}
public NameException(String message){
super(message);
}
}
使用:if(判断不合法的语句)
throw new NameException(name+"不合法");
NameException:按照见名知意的原则,按照需要自定义异常名
throw: 制造异常
常用类
学习API类型:
了解类的作用与特点
学习构造器
学习方法
成员
非静态
静态的
底层分析:
jdk11 ->使用字节数组存储字符串数据 private final byte[] value;
jdk8 -> 使用字符数组存储字符串数据 private final char[] value;
String字符串
String:不可变长字符序列,表示字符串,写在" "中
eg:“abc”,“123”,"张三"等
String str = “abc”; "abc"表示字符串常量,在方法区的字符串常量池中
new String() --------new创建对象,在堆中
常用类:
String str = "jintiantianqizhenhaohahaha";
String str2 = "Jintiantianqizhenhaohahaha";
常用类 | 描述 | 返回值 |
---|---|---|
charAt(int index) | 返回指定索引处的 char值 | 字符 |
codePointAt(int index) | 返回指定索引处的字符(Unicode代码点) | 数值(对应字符的ASCII值) |
compareTo(String anotherString) | 按字典顺序比较两个字符串。 | 数值(两个字符的ASCII差值) |
compareToIgnoreCase(String str) | 按字典顺序比较两个字符串,忽略大小写差异。 | 数值(ASCII差值,大小写不区分) |
concat(String str) | 将指定的字符串连接到此字符串的末尾 | 字符串(拼接) |
contains(CharSequence s) | 当且仅当此字符串包含指定的char值序列时,才返回true | boolean值 |
equals(Object anObject) | 将此字符串与指定的对象进行比较 | boolean值(仅比较内容) |
equalsIgnoreCase(String anotherString) | 将此 String与另一个 String比较,忽略了大小写 | 同上,忽略大小写差异 |
endsWith(String suffix) | 测试此字符串是否以指定的后缀结尾 | boolean |
copyValueOf(char[] data)【静态方法】 | String | |
int indexOf(String str) | 返回指定子字符串第一次出现的字符串中的索引。 | int |
int indexOf(String str, int fromIndex) | 从指定的索引处开始,返回指定子字符串第一次出现的字符串中的索引 | int |
int length() | 返回此字符串的长度。 | int |
StringBuilder 与 StringBuffer
字符串缓冲区的下,效率相对String更快,建议使用此类优先于StringBuffer因为在大多数实现中它会更快。
String 不可变长的字符序列,对字符串做少量改动的时候推荐使用
StringBuilder 可变长字符序列 , 线程不安全 ,单线程下大量操作字符串推荐使用
StringBuffer 可变长字符序列 , 线程安全的 ,多线程下大量操作字符串推荐使用
执行效率: StringBuilder > StringBuffer > String
StringBuilder 与 StringBuffer(方法差不多,以StringBuilder为例)
方法名 | 描述 |
---|---|
StringBuilder() | 构造一个字符串构建器,其中不包含任何字符,初始容量为16个字符 |
StringBuilder(int capacity) | 构造一个字符串构建器,其中没有字符,并且具有 capacity参数指定的初始容量–>能够确定容量的情况下可以选择使用 |
StringBuilder append(boolean b) | 将 boolean参数的字符串表示形式追加到序列中 |
StringBuilder delete(int start, int end) | 删除此序列的子字符串中的字符。 结束索引不包含 |
StringBuilder insert(int offset, String str) | 将字符串插入此字符序列 |
StringBuilder reverse() | 导致此字符序列被序列的反向替换 |
String 与 StringBuilder|StringBuffer 相互转换:
StringBuilder(String str)
构造一个初始化为指定字符串内容的字符串构建器。
String(StringBuffer buffer)
分配一个新字符串,其中包含当前包含在字符串缓冲区参数中的字符序列。
String(StringBuilder builder)
分配一个新字符串,其中包含当前包含在字符串构建器参数中的字符序列。
扩容机制: int newCapacity = (oldCapacity << 1) + 2; 原容量的2倍+2
Math(静态工厂)
方法 | 描述 |
---|---|
static double ceil(double a) | 向上取整 |
static double floor(double a) | 向下取整 |
static double max(double a, double b) | 返回两个 double值中较大的 double |
static double pow(double a, double b) | 返回第一个参数的值,该值是第二个参数的幂(求一个数的次方) |
static double random() | 随机数,返回带有正号的 double值,大于或等于 0.0且小于 1.0 |
static long round(double a) | 返回与参数最接近的 int ,并将关系四舍五入为正无穷大。 -->小数点后1位四舍五入 |
static double sqrt(double a) | 返回 double值的正确舍入正平方根(开平方) |
基本数据类型和其包装类
引用数据类型的作用:
包装类是类,类中可以定义成员,增强使用能力(成员变量,成员方法…)
类似集合,要求只能存储引用数据类型的数据
基本数据类型与引用数据类型的默认值(null)
基本数据类型的优势:
基本数据类型比引用数据类型更节省内存空间,存在性能优势
基本数据类型与其对应的包装类:
基本数据类型 | 对应引用数据类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
自动拆装箱:
自动装箱 : 基本—> 包装
自动拆箱 : 包装—> 基本
比较:
使用 == :
基本数据类型->数据值
引用数据类型->地址值
1.两个基本数据类型int比较,只要数据值相等就相等
2.两个new Integer()比较,肯定不相等,因为new每个对象堆内存中地址不同
3.Integer与new Integer()比较肯定不相等.因为new不同的地址
4.基本数据类型int与Integer|new Integer比较,如果数据值相等肯定相等,因为包装类会发生自动拆箱,然后比较数据值
5.两个Integer比较,在缓冲区范围[-128,127]之间就相等,同一个缓冲区对象,否则返回new Integer()
public static void main(String[] args) {
int i1 = 127;
int i2 = 127;
//Integer.valueOf(127) Integer缓冲区对象能够表示的数据范围:[-128,127]
Integer i3 = 127;
Integer i4 = 127;
Integer i5 = new Integer(127);
Integer i6 = new Integer(127);
Integer i7 = 128;
Integer i8 = 128;
System.out.println(i1==i2); //true
System.out.println(i3==i4); //true
System.out.println(i1==i3); //true
System.out.println(i5==i6); //false
System.out.println(i1==i6); //true
System.out.println(i3==i6); //false
System.out.println(i7==i8); //false
}
Enum枚举类
枚举类 : 当能够确定一种事物的所有可能,一个类型的所有对象的时候
是类,定义枚举类型 enum
java中所有的枚举类型都会隐式的继承自java.lang.Enum, 这是所有Java语言枚举类型的公共基类。
枚举类中的字段,就为做当前枚举类型的一个实例存在,默认被 public static final修饰
可以配合switch使用
Date日期
Date类表示特定的时刻,精度为毫秒
Date对象并对其进行初始化,使其表示分配时间,测量 Date到毫秒
方法:
SimpleDateFormat 格式日期转换器
SimpleDateFormat simple = new SimpleDateFormat(); --> 默认格式
SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");----->自定义格式
format() 日期对象转换字符串
simple.format(date)
parse() 字符串转为日期对象
String datestr = "2021-06-10 17:22:53";
simple.parse(datestr)