异常
程序没有按照设计的正常的逻辑执行,出现了不可预知的情况,就叫异常。
一旦程序出现异常,就会终止运行。
学习异常的目的:
- 当程序遇到处理不了的情况,抛出(产生)一个异常,终止程序
- 当发生异常时候,给出提示,让程序能继续执行
异常的分类
异常是java里的一种类,所有的异常类的根类是Throwable.
异常都是继承至Throwable, 分为两个大类:
一是Error错误,一般是虚拟机异常,这种错误我们的代码没有办法处理;
二是Exception异常, 我们的代码可以抛出异常或者是处理异常
Exception又分为两大类别:1. RuntimeException 运行时异常;2. 非运行时异常.
处理异常
一.抛出异常
1.在代码中用throw 抛出一个Exception类型或子类型的对象
2.在方法上面添加throws声明,后面的异常类型要大于等于代码中抛出的异常
//在方法上面需要添加throws申明,后面的异常类型要大于等于代码中throw的类型
public String getSex(int sex) throws Exception {
if(sex == 0){
return "女";
}else if(sex == 1){
return "男";
}else{
//抛出异常,用throw关键字,后面跟上Exception类型(或子类)的对象
//参数的字符串就是异常的消息
throw new Exception("性别只能是1或0");
}
}
二.try catch关键字
当我们调用的方法抛出了非Runtime的异常,就会报编译错误,要求代码添加try catch语句来处理异常, catch语句可以有多个, 也可以只有一个(如果只有一个catch,这个异常类型要大于等于抛出的最大的那个异常类型)finally语句块的代码一定会被执行的(不管有没有异常都会执行)只要有非运行时异常时,try catch语句必不可少, 但是finally是可选的
try {
createException.getName();
createException.getSex(2);
System.out.println("出现异常语句之后的代码");
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}finally {
//finally的代码一定会被执行(不管有没有异常)
System.out.println("finally语句块");
}
System.out.println("try语句之后的代码");
此外,如果方法中抛出的继承至RuntimeException的类型异常, 不会强制要求添加throws 或 try catch, 不会导致编译错误只有在运行时有可能抛出异常。
集合
一些数据结构的统称集合,包含List, Set, Map
List
List是列表,用来存储一组数据,是一种可变长的数据结构,可以知道List中有多少个数据
List可以存放不同数据类型的数据,是一个有序列表,数据可以重复
List的基本使用add();get();size();
ArrayList 是采用数组方式实现的读和遍历比较快, 插入和删除数据比较慢
set
无序集合,元素不重复,没有索引(序号),不能通过下标访问
HashSet 采用hash表实现元素不重复, 无序的, 允许存null,不能按下标读取元素,只能遍历
使用 一般在对数据去重时,将数据存入HashSet可以达到去重的目的
哈希表
哈希表,也称散列表,是一种高效数据结构要保存的数据称为值, 根据hash算法给每个值算出一hash code保存数据就用hash code 跟value一一对应。
hash table存储数据 根据hash code从表里查找是否存在:不存在,直接添加;存在,再判断equals是否相等:false, 直接添加;true, 说明两个值是一样的,不添加
Hash code的 结论 两个值的hash code相同, 它们的equals不一定相同;两个值的equals相同, hash code不一定相同;两个值的hash code相同, equals也相同, 这两个值一定相同
Map
保存键值对数据(key - value);key不能重复, value可以重复;key和value都可以为null
HashMap 采用数组+链表+红黑树的数据结构来实现的;先根据hash code保存数组,如果出现hash碰撞,用链表链表,长度超过8,改用红黑树