一、异常处理和I/O操作
1.关于异常处理
try:里面放可能出现错误的代码
catch:如果try中出现错误,就运行catch中的代码(相当于解决了错误);如果try中没有出现错误,就不执行catch
finally:不管try有没有错误,finally中的代码都会被执行
2.throw和throws的区别:
2.1. throws
出现在方法声明上,而throw通常都出现在方法体内。
2.2. throws
表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某个异常对象。
3.异常的分类
• 错误 :不要求强制捕捉
• 运行时异常:不要求强制捕捉
• 可查异常:要求使用try catch强制捕捉
4.Throwable类
Throwable是类,Exception和Error都继承了该类
所以在捕捉的时候,也可以使用Throwable进行捕捉
如图: 异常分Error和Exception
Exception里又分运行时异常和可查异常。
5.FileStream和FileReader
5.1Filetream为了能够正确的读取中文内容
• .必须了解文本是以哪种编码方式保存字符的
• 使用字节流读取了文本后,再使用对应的编码方式去识别这些数字,得到正确的字符
比如:一个文件中的内容是字符中,编码方式是GBK,那么读出来的数据一定是D6D0。
再使用GBK编码方式识别D6D0,就能正确的得到字符中
注: 在GBK的棋盘上找到的中字后,JVM会自动找到中在UNICODE这个棋盘上对应的数字,并且以UNICODE上的数字保存在内存中。
6.使用缓存流读取数据
6.1缓存流
(BufferedReader,PrintWriter)缓存流必须建立在一个存在的流的基础上(字符流)
如代码:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class TestStream {
public static void main(String[] args) {
// 准备文件test.txt其中的内容是
//this is the first line
// and this is the second line
// hahaha,this is the third line
File f = new File("d:/test.txt");
// 创建文件字符流
// 缓存流必须建立在一个存在的流的基础上
try (
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);
)
{
while (true) {
// 一次读一行
String line = br.readLine();
if (null == line)
break;
System.out.println(line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
6.2flush
有的时候,需要立即把数据写入到硬盘,而不是等缓存满了才写出去。 这时候就需要用到flush
7.梳理图
二、容器和泛型
1.集合框架与数组的区别
1.1数组的局限性
如果要存放多个对象,可以使用数组,但是数组有局限性
比如 声明长度是10的数组,不用的数组就浪费了超过10的个数,又放不下。
1.2引入容器
为了解决数组的局限性,引入容器类的概念。 最常见的容器类就是ArrayList
容器的容量"capacity"会随着对象的增加,自动增长,只需要不断往容器里增加英雄即可,不用担心会出现数组的边界问题
2.容器的常用方法
3.泛型
不指定泛型的容器ArryList,可以存放任何类型的元素
ArrayList heros = new ArrayList();
List heros = new ArrayList();(List为ArrayList接口)
指定了泛型的容器,只能存放指定类型的元素以及其子类
List genericheros = new ArrayList();
List genericheros2 = new ArrayList<>();
4.遍历容器
• 使用for循环
• 使用增强型for循环
• 使用迭代器
使用迭代器遍历代码:
List<Hero> heros = new ArrayList<Hero>();
//放5个Hero进入容器
for (int i = 0; i < 5; i++) {
heros.add(new Hero("hero name " +i));
}
Iterator<Hero> it= heros.iterator();
//从最开始的位置判断"下一个"位置是否有数据
//如果有就通过next取出来,并且把指针向下移动
//直到"下一个"位置没有数据
while(it.hasNext()){
Hero h = it.next();
System.out.println(h);
}
5.集合框架还有
5.1
• LinkedList是一个双向链表结构的list
除了实现了List接口外,LinkedList还实现了双向链表结构Deque
LinkedList ll =new LinkedList();
• LinkedList 除了实现了List和Deque外,还实现了Queue接口(队列)。
Queue q= new LinkedList();
5.2二叉树
public class Node {
// 左子节点
public Node leftNode;
// 右子节点
public Node rightNode;
// 值
public Object value;
}
5.3HashMap键值对
HashMap<String,String> dictionary = new HashMap<>();
5.4HashSet
Set中的元素,不能重复
HashSet names = new HashSet();
//第二次插入同样的数据,是插不进去的,容器中只会保留一个names.add(“gareen”);
5.4.1几种不同的Set
HashSet: 无序
LinkedHashSet: 按照插入顺序
TreeSet: 从小到大排序
5.5Collection
• Collection是 Set List Queue和 Deque的接口
关系汇总:
• Collections是一个类,容器的工具类,就如同Arrays是数组的工具类
6.比较器
Comparator:如果一个类中存在多个可比较的属性,直接用
Collections.sort也无法确定所以要指定到底按照哪种属性进行排序,这里就需要提供一个Comparator给定如何进行两个对象之间的大小比较
Comparable:使类实现Comparable接口,在类里提供比较算法,Collections.sort就有足够的信息进行排序了,也无需额外提供比较器Comparator