异常
当错误发生的时候减少损失,提高容错性
1、异常的分类
Throwable有两个子类:Error和Exception。
一个Error对象表示一个程序错误,指的是底层的、低级的、不可恢复的严重错误。此时程序一定会退出,因为已经失去了运行所必须的物理环境。
对于Error错误我们无法进行处理,因为我们是通过程序来应对错误,可是程序已经退出了。
我们可以处理的Throwable类中只有Exception类的对象(例外/异常)。
Throwable
|
------------------
| |
Error Exception
错误 |
非常严重 |
不能处理 --------------
| |
RuntimeException 非Runtime异常
未检查异常 已检查异常
由于程序员疏忽造成的 不可避免的
可避免的 必须处理
可处理,可不处理
2、异常的产生和传递
throw new一个异常对象; ---表示抛出一个异常
throw new NullPointerException();
相当于return,函数返回上一级
传递:
沿着方法调用链的顺序反向传递! (异常抛出)mc---->mb---->ma----->main----->Java虚拟机(停止运行)
当一个方法中出现异常,而没有作处理,则以异常对象为返回值返回调用处(逐级传递)
异常返回给虚拟机时,虚拟机终止退出,程序结束
3、异常的处理
(1)声明抛出
是方法声明的第五部分 throws+异常名字(多个异常用“,”分隔)
出现异常,不处理,抛给上一级处理
并且子类抛出异常的范围不能比父类抛出异常的范围更宽。
(2)捕获异常
try - catch
try - catch - finally
try - finally //不捕获异常,当异常发生,返回上一级之前,要运行finally中的代码
以上语句可以嵌套
返回类型 方法名(参数){
try{
可能出错语句
正常语句
}catch(异常类 e){ //某种异常的引用
对异常的处理
}
正常语句
}
捕获多个异常:
程序任何时刻只发生一个异常
可对产生的每个异常分别捕捉,也可由同一异常进行处理,前提是这个共用的异常应该是所有这些该被捕获的异常的父类,但是,对于非受查异常不成立
当try后面有多个语句块时,注意catch异常的顺序,子类必须放在父类的前面
finally关键字
无论异常是否发生,一定会执行的代码,可放在finally块内。
要点:没有异常产生时:正常执行try{}catch(){} —> 进入finally语句块 —> 方法中剩余代码
有异常产生时(捕找到) —> 进入catch处理 —> 进入finally语句块 —> 方法中剩余代码
有异常产生时(没捕找到)—> 进入finally语句块 —> 离开方法
一般finally写一些释放资源的代码
在try - catch 块中遇到System.exit(0);或断电,则不会执行finally中的代码
Throwable有一个message属性。在使用catch的时候可以调用:
Catch(IOException e){System.out.println(e.getMessage())}; //打印出来的是创建(throw new)异常对象的时候,给定的参数
Catch(IOException e){e.printStackTrace()}; //打印堆栈追踪信息
以上两条语句都是可以打印出错的过程信息。告诉我们出错类型所历经的过程,在调试的中非常有用。
开发中的两个道理:
①如何控制try的范围:根据操作的连动性和相关性,如果前面的程序代码块抛出的错误影响了后面程序 代码的运行,那么这个我们就说这两个程序代码存在关联,应该放在同一个try中。
②对已经查出来的异常,有throw(消极)和try catch(积极)两种处理方法。
对于throws把异常抛到try catch能够很好地处理异常的位置(即放在具备对异常进行处理的能力的位置 )。如果没有处理能力就继续上抛。
4、自定义异常
(1)继承Exception类
(2)构造方法:
不带参数的构造方法
带参数的构造方法:参数指出错误性质,super(message);把参数传递给父类构造异常
当我们自己定义一个异常类的时候必须使其继承excepiton或者RuntimeException。
throw和throws的区别:
throw后跟异常对象 ,写在方法体内,throw是一个语句,用来做抛出异常的功能。后面的代码不会再运行。
throws用在方法的声明中,在参数表之后函数体之前。而throws是表示如果下级方法中如果有异常抛出,那么本方法不做处理,继续向上抛出。
throws后跟的是异常类型。
例:pulbic Animal(String name,int legs) throws Exception{
this.name=name;
if(legs<0||legs%2!=0){
throw new Exception("错误的腿的条数");
}
this.legs=legs;
}
注意:方法的覆盖中,如果子类的方法抛出的异常是父类方法抛出的异常的父类型,那么编译就会出错:子类无法覆盖父类。
结论:子类方法不可比父类方法抛出更多的异常。子类抛出的异常或者与父类抛出的异常一致,或者是父类抛出异常的子类型。或者子类型不抛出异常。
如果父类型无throws时,子类型也不允许出现throws。此时只能使用try catch。
断言:
断言是一种调试工具(assert) 1.4增加的
其后跟的是布尔类型的表达式,如果表达式结果为真不影响程序运行。如果为假系统出现低级错误,在屏幕上出现assert信息。
Assert只是用于调试。在产品编译完成后上线assert代码就被删除了。
到此JAVA第一部分结束了
第二部分API: GUI 图形界面
Thread 多线程
I/O (文件/网络)
net 网络编程
第三部分:JDK5.0的新特性
第六章串讲
1、修饰符
2、接口
接口 抽象类
没有构造方法 有构造方法
没有非抽象方法 可以有非抽象方法
接口中所有的属性都是static final 没有该限制
方法默认访问权限是pulbic的 没有该限制
接口的多态
为什么用接口:1、为了解决JAVA不能多继承的问题 2、可以把标准的制定者与标准的实现者分离
3、内部类
为什么使用内部类:1、缩小命名空间
2、现实中有这样的需求,B类对象的存在以A类对象的存在为前提。(A类是外部类,B类是内部类)
3、B类中访问到A类私有成员
4、反射
5、集合
1、集合框架
会用:1、选择哪种 2、添加、删除、循环遍历,获得
2、 了解每一种集合类型底层数据结构和存储方式
HashSet 添加元素的规则
对我们覆盖hashCode 和 equals 方法有何指导意义
6、包装类 记住金三角
小知识点:
1、equals(),toString(),hashCode()这些方法的覆盖
2、main()方法的参数
3、String 和 StringBuffer