目录
一、异常
1.try…catch
例
public static void main(String[] args) {
int[] arr = {1};
//try catch异常处理
try {
int i = getNum(arr);
System.out.println("i = " + i);
}catch (Exception ex){
System.out.println("异常被处理掉");
}
System.out.println(111);
}
public static int getNum(int[] arr){
return arr[1] + 10;
}
①Throwable类
public static void main(String[] args){
int[] arr = {1};
//try catch异常处理
try{
int i = getNum(arr);
System.out.println("i=" + i);
}catch (Exception ex){
//Throwable类的异常信息的方法
String message = ex.getMessage();//message=1
System.out.println("message=" + message);
String str = ex.toString();//str = java.lang.ArrayIndexOutOfBoundsException: 1
System.out.println("str=" + str);
/**
* 控制台输出
* 出现问题的异常类的类,错误的原因
* 发生的代码行数
*/
ex.printStackTrace();
}
System.out.println(111);
}
public static int getNum(int[] arr){
return arr[1] + 10;
}
②多catch并行处理
异常处理的代码中,try可以跟随多个catch
好处:不同的异常,可以区别对待,分开处理
注意:如果catch中的异常类没有关系,先写后写没有区别;catch中的异常类有继承关系,父类写在最下面
2.throw和throws关键字的使用
throw关键字 : 只能写在方法内部, 关键字的后面跟随对象的创建
throws关键字 : 只能写在方法的定义上,关键字后面跟随异常类名
例
public static void main(String[] args) {
/**
* getArea()调用方法,方法上有异常
* 只能处理,不处理编译失败
* 在main的方法上加throws 异常没有处理,交给JVM处理
* try catch处理
*/
try {
int area = getArea(-10);
System.out.println(area);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 功能: 计算正方形的面积
* 需要参数 : 边长
* 语法 : 方法的内部出现了异常,必须在方法定义上暴露
*/
public static int getArea(int length) throws Exception{
if (length <= 0)
//数据错误,导致后面的计算不能进行
//内部出现问题
throw new Exception("边长不存在");
return length * length;
}
3.finally代码块
finally代码块跟随try ... catch使用,也有跟随try使用,finally代码块里面的程序,无论是否出现异常,都会执行,必须执行,结束JVM了,finally不执行
作用:主要用于释放资源
public static void main(String[] args) {
try {
int[] arr = {1};
System.out.println(arr[0]);
}catch (Exception ex){
ex.printStackTrace();
}finally {
//后期用于资源的释放
System.out.println("这里的代码,必须执行");
}
}
4.Runtime异常
异常的父类是Exception,Exception类的子类RuntimeException,凡是RuntimeException和他的所有子类,都称为运行异常,非子类的称为编译异常Exception异常
编译异常 :
方法出现编译异常,调用者必须处理,否则编译失败.处理方式可以是try catch或者是throws都可以
运行异常 :
方法出现运行异常,方法的定义上,不需要throws声明,调用者也不需要处理这个异常
常见的运行异常:
NullPointerException空指针
IndexOutOfBoundsException越界异常
ClassCastException类型强制
IllegalArgumentException无效的参数异常
5.自定义异常
自定义异常,入伙,继承Exception或者RuntimeException
只有Exception和他的子类,才具有可抛出性
自定义的类中,构造方法,super调用父类构造方法,传递异常信息
例
自定义的异常类:
成绩负数的异常
自定义异常信息 : 继承父类 RuntimeException 带有String类型的构造方法 (String 异常信息)
public class ScoreException extends RuntimeException{
public ScoreException(String s){
super(s);
}
}
public static void main(String[] args) {
// int[] arr = {1};
//System.out.println(arr[2]);
int avg = getAvg(-100,2);
System.out.println("avg = " + avg);
}
/**
* 计算成绩的平均分
*/
public static int getAvg(int math,int chinese){
//判断成绩的数值
if ( math < 0 || chinese < 0)
//手动抛出,自己定义的异常
throw new ScoreException("成绩不存在");
return (math + chinese) / 2;
}
二、集合框架
1.集合框架由来
①集合本质上是存储对象的容器
②数组也能存储对象,数组弊端就是定长
③解决数组的问题,开发出来集合框架,集合框架无需考虑长度
④集合和数组的区别与共同点
集合,数组都是容器,都可以存储数据
集合只存储引用数据类型,不存储基本数据类型
数组可以存储基本类型,也可以存储引用类型
数组定长,集合容器变成
数据多了存数组,对象多了存集合
2.集合框架的继承体系
①Collection (集合) 接口 单列集合
List (列表) 接口
ArrayList (数组列表) 实现类
LinkedList (链表) 实现类
Vector(数组列表) 实现类,过时了
Set (集) 接口
HashSet(哈希表) 实现类
LinkedHashSet(链表哈希表) 实现类,继承HashSet
TreeSet(红黑树) 实现类
②Map (映射键值对) 接口 双列集合
- HashMap(哈希表) 实现类
- LinkedHashMap(链表哈希表) 实现类,继承HashMap
- TreeMap(红黑树) 实现类
- Hashtable(哈希表) 实现类,过时
- Properties(哈希表)实现类, 继承Hashtable
- ConCurrentHashMap (哈希表) 线程相关
③Iterator迭代器接口
④泛型 Generic
- 写法
- 泛型类,泛型方法,泛型接口,泛型限定,泛型通配符
⑤for(:)循环
3.Collection接口
①定义
是所有单列集合的顶级接口,任何单列集合都是他的子接口,或者是实现类, 该接口中定义的方法,是所有单列集合的共性方法
Collection<E> 尖括号就是泛型,E我们要写,集合存储的数据类型
②Collection接口的常用方法
方法的定义 |
方法作用 |
---|---|
boolean add(E) |
元素添加到集合 |
void clear() |
清空集合容器中的元素 |
boolean contains(E) |
判断元素是否在集合中 |
boolean isEmpty() |
判断集合的长度是不是0,是0返回true |
int size() |
返回集合的长度,集合中元素的个数 |
boolean remove(E) |
移除集合中指定的元素,移除成功返回true |
T[] toArray(T[] a) |
集合转成数组 |