JAVA中异常处理
异常 【掌握】
异常的概述
什么是异常
就是程序的运行的过程中,出现的不正常情况。
异常的继承体系结构
java是面向对象的语言,在java中要研究任何的东西都必须先封装成对象,对象一定会有对应的类。
异常也是一样的,封装了对象之后就可以更加方便的研究和处理异常,异常有很多,那么对应的异常类
也会有很多。这些异常类的共性不断向上抽取,就形成了异常的继承体系结构。
Throwable
|-Error:严重的错误,无法通过异常处理语句进行处理的,这里的问题有些是硬件的问题、或者是需要修改代码逻辑才能解决的问题
|-Exception:非严重的错误,可以通过异常处理语句进行处理的
|-编译时异常
|-运行时异常
注意:
1、我们要研究的是Exception子体系
2、异常类非常多,但是这些异常类不需要单独一个个去学习,因为他们的区别只是一个名字的区别
异常根据名字做到区分,取名是遵循见名知义的原则,见到类名就知道这是什么异常。
异常的分类
编译时异常:
Exception下除了RuntimeException及其子类之外的都是属于编译时异常
编译时异常在编译时期就会报出,如果没有处理编译就会报错
运行时异常:
RuntimeException及其子类
运行时异常在编译时期不会报出,编译时期不处理不会报错
JVM默认处理异常的方式
1、在异常发生处停止程序的运行
2、将发生的异常信息以红色字体的方式打印在控制台
异常处理语句
方式一:声明抛出处理 throws
// 在方法的声明处,使用throws关键字将异常类名进行抛出的处理方式
修饰符 返回值类型 方法名(参数列表) throws 异常类名 {
方法体;
}
throws这种处理方式一般是对编译时异常进行处理,一般不会对运行时异常进行处理,因为没有意义
throws抛出处理的方式并不是正在的在处理问题,而是一种踢皮球的方式,将自己的问题踢给别人,
从而达到自己没有问题,但是别人接收到了这个问题,别人还是要处理。
throws真正能处理只是程序的编译报错问题
方式二:捕获处理 try...catch
格式一
try{
}catch(异常类名 变量名) {
}
格式二
try{
}catch(异常类名 变量名) {
}finally {
}
格式三
try{
}finally {
}
格式的注意事项:
1、只有以上三种格式组合
2、try和finally语句只能有一个,catch语句可以有多个
3、try:检测、尝试
一般存放的是可能会出现异常的代码,进行检测看到底有没有异常
catch:捕获
如果在try中检测到出现了异常,则会通过catch进行捕获并处理
catch小括号是用于捕获的
catch大括号是用于处理的
finally:最终
它表示一定会执行的语句,最终不管是否出现异常都一定会执行的语句
比如:一些资源的释放代码这类收尾性的代码
总结:
throws一般用于处理编译时异常,处理编译报错,但是没有真正处理调用异常,一般不处理运行时异常
try...catch既可以处理编译时异常,也可以处理运行时异常,是一种真正处理异常的方式
throw和throws的区别
throw:它不是处理异常的方式之一,你可以将它理解为制造异常并抛出给使用者,告诉使用者要处理这个问题
throw使用在方法中,throw后面跟的是异常对象(名),后面跟的对象只能有一个
NullPointerException e = new NullPointerException();
throw e;// 异常对象名
throw new NullPointerException();// 异常对象
throws:是异常处理的方式之一,抛出处理异常
throws使用在方法声明上,throws后面跟的是异常类名,后面跟的异常类名可以是多个
自定义异常 【了解】
什么是自定义异常
就是我们不使用JDK提供的那些异常(类),而是自己定义异常类
为什么要自定义异常
为了做到见名知义
其实JDK提供的异常我们也都能使用,只不过我们希望做到,看到异常类的名字就能反映
这个异常出现了什么问题。
如何自定义异常
1、创建一个类继承Exception或者RuntimeException
* 如果想自定义一个编译时异常,就继承Exception
* 如果想自定义一个运行时异常,就继承RuntimeException
2、生成一些构造方法,我们就给两个即可:一个空参,一个带字符串参数的构造(可以传递异常出现的原因)
自定义的异常如何使用
和JDK提供的这些异常一样使用
Collection-List 【掌握】
常用集合类的体系结构
单列集合
Collection
|-List:存取有序,有索引,可以存储重复元素的
|-ArrayList:底层使用的是数组结构
|-LinkedList:底层使用的是双向链表结构
|-Vector
|-Set:不保证存取有序,无索引,不能存储重复元素
|-HashSet
|-TreeSet
双列集合
Map
|-HashMap
|-TreeMap
学习体系结构的时候都应该从上往下学,最上面的类(接口)定义了最多的共性
Collection接口
成员方法
boolean add(E e) 添加元素
boolean remove(Object o) 从集合中移除指定的元素
boolean removeIf(Object o) 根据条件进行移除
void clear() 清空集合中的元素
boolean contains(Object o) 判断集合中是否存在指定的元素
boolean isEmpty() 判断集合是否为空
int size() 集合的长度,也就是集合中元素的个数
Iterator<E> iterator() 集合的遍历方法
// 获取到迭代器
Iterator<String> it = coll.iterator();
while(it.hasNext()) {
String s = it.next();
}
Collection中没有任何一个和索引相关的方法。
以下属于Collection接口中的方法的是(C)
A、remove(int index)
B、set(int index,E e)
C、add(E e)
D、add(int index,E e)
迭代器(Iterator)
就是一个遍历集合的工具。
成员方法
boolean hasNext():判断集合中是否还有下一个元素,如果有就返回true,否则返回false
E next() :获取下一个元素,并将光标往下移动一位
void remove() :在迭代器遍历的时候支持删除操作
增强for
for(元素数据类型 变量名:单列集合或者数组){
// 变量名中记录的就是集合中的每一个元素
}
快捷键:iter + 回车
集合的遍历方式
1、普通for循环,使用get(int index)和size()方法 【只能适用于List子体系下的集合】
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
System.out.println(s);
}
2、迭代器 【适用于所有的单列集合】
Iterator<String> it = list.iterator();
while(it.hasNext()) {
String s = it.next();
System.out.println(s);
}
3、增强for 【适用于所有的单列集合】
for(String s:list){
System.out.println(s);
}
List子体系
List是Collection的子接口,所以Collection中的所有的方法List中都有(共性),
除此之外,List中还有自己特有的方法
特点:
存取有序
有索引
可以存储重复元素的
特有方法(都是和索引相关的方法)
void add(int index,E element) 在此集合中的指定位置插入指定的元素
E remove(int index) 删除指定索引处的元素,返回被删除的元素
E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
E get(int index) 返回指定索引处的元素
数据结构
栈:先进后出,后进先出(LIFO) last in first out
队列:先进先出,后进后出
数组:查询修改快,增删慢
链表:查询修改慢,增删快
红黑树
哈希表
节点(Node)
记录上一个节点的地址
数据值
记录下一个节点的地址
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ahir's Blog!
评论
GitalkDisqusjs