一、异常
(一)异常的概述
1.概述:再java运行过程中,出现了不正常的情况
2.异常就是一个对象,描述那些和正常情况不相符的异常情况
3.异常也是一种处理异常情况的机制,可以对异常对象进行捕获,或者使程序发生跳转甚至停止运
行
(二)异常的体系
1.Throwable:可抛出的,是异常体系和错误体系的总父类,所有的异常或者错误都是对象
2.Error:错误,是Throwable的子类,用于描述哪些无法捕获和处理的严重错误,属于非常严重的
错误
3.Exception:异常,是Throwable的子类,用于描述哪些可以被捕获或者处理的特殊情况,属于不
太严重的错误
4.Exception:是java中所有异常类型的总父类,异常类型都是它的子类
5.RuntimeException:运行时异常,是Exception的子类;RuntimeException底下的子类都属于运
行时异常
(三)JVM默认处理异常机制
JVM默认处理异常的方式,一层一层往上抛,JVM接收到之后打印异常信息并结束自己
(四)手动处理异常的方式
1.有两大类的处理方式
(1)异常的声明:某个方法存在编译时异常的时候,编译期就无法通过,需要在出现异常的方法
声明上对可能会发生的异常类型进行声明
(2)异常的捕获:出现了异常之后,可以通过某些代码格式对异常对象进行捕获和处理,此时,
程序出现的异常对象,就不会在往上抛了,而是被捕获下来,我们做出相应的处理后,出现异常代
码之后的代码会继续执行,我们可以自己定义异常的逻辑
2.捕获处理异常的格式
(1)try...catch...
(2)try...catch..catch...catch...
(3)try...catch...finally..
(4)try...finally
(五)try...catch...
1.try:关键字,含义:试一试,可能出现问题的代码放在try模块中
2.catch:关键字,含义:捕获,当真的出现了异常时,问题代码会抛出一个异常对象,可以通过
catch模块将异常对象捕获下来进行处理
3.格式
try { 可能出现异常的代码; } catch (可能出现异常的类型 标识符) { 出现这种异常后的处理手段; }
(六)try...catch..catch...catch...
1.在一段代码中,可能会出现多个异常所以需要准备多种异常处理
2.格式
try { 可能出现异常的代码; } catch (可能出现异常的类型1 标识符1) { 出现这种异常后的处理手段1;
} catch (可能出现异常的类型2 标识符2) { 出现这种异常后的处理手段2; } catch (可能出现异常的类
型3 标识符3) { 出现这种异常后的处理手段3; }
3.注意事项
(1)在多catch模块中,一般子类类型异常声明在上面,父类异常声明在下面
(2)虽然可以直接写Exception,但是对于异常错误无法具体阐述
(3)在JDK7之后,可以对异常类型进行逻辑运算,实际上就是使用【|】来表示多种异常类型可
以用一种处理方式,并且可以结合多catch模块进行使用
(七)try...catch...finally...
1.finally,关键字,含义:最后的,当代码中有必须要执行的代码,可以放在finally表示的模块中
2.格式
try { 可能出现异常的代码; } catch (可能出现异常的类型 标识符) { 出现这种异常后的处理手段; }
finally { 一定会被执行的代码; }
3.作用
(1)如果try中出现了异常,就会抛出异常对象,之后直接尝试使用catch进行捕获,万一没有捕获
到,后续的代码就不会执行。如果某些代码必须执行,就可以将这些代码放入finally中进行执行
(2)作用:一般用于关闭资源
(八)try...finally
1.格式
try { 可能出现异常的代码; } finally { 一定会被执行的代码; }
2.作用
(1)这种格式无法捕获异常,目的就是在于一旦出现异常,就采用默认处理机制,只是在关停虚
拟机之前,需要关闭一些资源,这些资源放在finally模块中
(2)假设如果有两句代码都要执行,两句代码都有可能发生异常,那么第一句代码写在try模块
中,另一句代码写在finally模块中,第一句出现问题,也会保证第二句也执行了
(九)throw关键字
1.抛出,用于抛出一个异常对象
2.程序在运行过程中,发生异常的时候抛出的是一个实实在在的异常对象,我们在实际应用中,如
果代码中哪里有与生活不相符的情况,可以将异常信息封装为一个异常对象,通过throw关键字将
异常对象抛出
3.作用:创建一个异常对象,使用throw关键字抛出,实现了程序的跳转甚至结束
4.说明:当代码正常运行的时候,运行时异常不会发生,就相当于没有任何异常对象,当代码运行
过程中出现了异常情况,才会创建异常对象并且抛出
(十)throws关键字
1.抛出,用于声明一个或多个异常类型
2.使用:在某个方法中,如果存在一些编译时异常,并且这些异常还尚未处理,就会报编译时异
常,我们就必须对编译时异常进行处理:捕获或者声明,如果需要声明编译时异常,就需要在方法
的声明上,参数列表之后,跟上关键字throws,并且注明声明一个或几个异常类型
3.格式
修饰符 返回值类型 方法名称(参数列表) throws 异常类型1, 异常类型2... { 方法体; }
4.注意事项
(1)如果发生的是编译时异常,既可以进行捕获,也可以进行声明
(2)如果发生的是一个运行时异常,不需要声明处理,最多只需要捕获处理,也可以选择不处
理,但是当运行时真正发生了异常的时候,会真的抛出一个异常对象
(3)A方法如果声明了编译时异常,那么B方法在调用A方法的时候也会有编译时异常,此时B方
法就必须针对编译时异常进行处理,要么声明要么捕获,如果A方法捕获了编译时异常,那么后续
在调用这个方法的时候,就不需要再进行异常的处理了
(4)声明异常的原则:尽量声明少的,声明小的异常类型
(十一)throw和throws
1.throw是对已经出现的异常对象进行抛出,throws关键字是对可能出现异常类型进行声明
2.throw是对异常对象实实在在的抛出,一旦使用了throw关键字,就一定会有一个异常对象,
throws关键字是对多个可能出现的异常类型进行声明,即使声明了多个,也有可能一个都不出现
3. throw后面跟一个异常对象,throws后面跟一个或多个异常类型
4.throws声明异常类型的时候,声明尽量声明少的,声明小的异常类型
(十二) 方法重写的补充说明
1.重写:在子父类中,方法名称相同,参数列表相同,与返回值类型有关
2.有关:父类方法返回值是A类,子类重写的方法返回值是A或者A的子类
3.权限修饰符可以越来越大
4.私有方法不能重写
5.如果父类方法声明了A类型的异常,子类重写的方法只能声明A类型异常或者A的子类类型的异常
6.如果父类方法没有声明异常,子类重写的方法中有编译时异常,只能try...catch,不能throws
(十三)自定义异常
1.异常报错时,异常类型就能见名知意的知道是什么类型的问题,但是由于JDK中提供的异常类型
非常有限,为了满足日常开发需求,有时候需要我们自己定义异常的类型
2.创建步骤
(1)创建一个异常类型,类名做到见名知意
(2)需要让自定义类型加入异常体系
①如果自定义类型为运行时异常,就继承RuntimeException
②如果自定义类型为编译时异常,就继承【Exception】
(3)因为所有异常为了方便统一处理,都会使用Throwable中的方法,并且为了以后方便异常对
象的创建和处理异常信息,我们需要在自定义异常类型中重写父类构造
二、集合
(一)概述
也是一个类似数组的统一存储,管理数据的容器,集合只能存储引用数据类型,不能存储基本数据
类型
(二)优势
1.可扩展:底层自动增长,不同我们主动操作进行扩展,避免了不必要的麻烦
2.集合中定义了大量的操作集合的方法,这些方法十分易用
3.集合中存储的都是引用数据类型,以及对象,也利于面向对象编程思想
4.不带泛型的集合可以存储各种数据类型的数据
(三)集合体系
1.分类
(1)单列集合:每一个元素都是一个单独的个体,就类似于数组一样
(2)双列集合:每一个操作都针对一对数据进行,以一对数据为单位
2.单列集合体系:
3.双列集合体系:
三、Collection接口
(一)概述和常用方法
1.Collection,接口名,含义:收集,集合
2.单列集合的顶层接口,定义了所有单列集合共性的方法
3.Collection是接口没有办法创建对象,所以为了学习,我们先使用ArrayList子实现类,进行功能
的测试
4.常用方法:
(1)add(Object obj):将obj元素添加到集合中
(2)remove(Object obj):将obj元素从集合中删除
(3)clear():清空集合
(4)isEmpty():判断集合是否为空
(5)contains(Object o):判断是否包含指定元素
(6)size():返回元素的个数
(二)第一种遍历:转数组遍历
1.toArray()方法:将集合中的元素添加到数组中并返回数组
2.调用此方法,将集合存入数组返回数组,遍历数组拿到每一个元素
(三)第二种遍历:迭代器遍历
1.迭代:更新换代,从一个到另一个的过程
2.迭代器:专门用于将集合中的元素,一个到另一个的对象
3.迭代器的获取:集合内部就有一个可以迭代自己的对象,我们直接从集合获取即可
()iterator():返回一个迭代器对象
4.迭代器的使用:获取到迭代器是Iterator接口的实现类对象,再迭代器接口中有相应的方法
(1)hasNext():判断是否有下一个可以迭代的元素,如果有,返回true
(2)next():获取集合中的下一个元素
(3)remove():删除集合中迭代器正在遍历的那个元素
5.注意事项
(1)hasNext()方法只能判断下一个元素是否存在
(2)next()每次只能获取一个元素并且将迭代器指向下一个元素移动一个位置
(3)调用一个hasNext()方法只能调用一次next()方法