黑马程序员-异常
2014-06-06 18:28 黑马程序员* 阅读(123) 评论(0) 收藏 举报异常总结
1.异常;就是程序运行时出现的不正常情况
异常的由来;问题也是现实生活中的一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象。其实就是java对不正常情况进行描述后的对象体现
严重的;java通过Error类进行描述
一般不编写针对性的代码进行处理
非严重的;java通过Exception类行进描述
对于Exception可以使用针对性的处理方式进行处理。
异常体系:
throwable
|--Error
|--Exception
|--RuntimeException
异常体系的特点;异常体系中所有类以及建立的对象都具备可抛性
也就是说可以被throw和throws关键字所操作。
只有异常体系具备这个特点。
throw和throws的用法区别;
throw定义在函数内,用于抛出异常对象。
throws定义在函数上,用于抛出异常类,可以抛出多个,用逗号隔开。
当函数内容有throw抛出异常对象,并未进行try处理,必须要在函数上声明,否则编译失败。
注意,RuntimeException除外,也就是说,函数内如果抛出RuntimeException异常,函数上可以不用声明。
如果函数声明了异常,调用者需要进行处理,处理方法可以throws,可以try
异常有两种:
编译时被检测异常
该异常在编译时,如果没有处理(也就是没有抛没有try),编译失败。
该异常被标识,表示可以被处理。
运行时异常(编译时不检测)
在编译时,不需要处理,编译器不检查,RuntimeException以及其子类。
三种结合方式
1.
try
{
}
catch ()
{
}
2.
try
{
}
catch ()
{
}
catch()
{
}
3.try
{
}
finally
{
}
注意;
1.finally中定义的通常是 关闭资源代码。因为资源必须要被释放
2.只有一种情况finally读不到,在final前面,调用System.exit(0)(系统退出,jvm结束)
自定义异常;
定义的类继承Exception或者RuntimeException
1.为了该自定义异常具备可抛性
2.让该类具备异常的共性方法。
当要定义自定义异常的信息时,可以使用父类已经定义好的功能。
将异常信息传递给父类的构造函数。
class myException extends Exception{
myException(String message){
super(message);
}
}
自定义异常:按照java的面向对象思想,将程序中出现的特有问题进行封装。
异常的好处:
1.将问题进行封装
2.将正常流程代码和问题代码相分离,方便阅读。
异常的处理原则:
1.处理方式两种:try或throws
2.调用到抛出异常的功能时,抛几个,处理几个。
一个try可以对应几个catch
3.多个catch,父类catch放到最下面。
4.catch内,需要定义针对性的处理方式,不要什么都不写。
当捕获的异常,本功能处理不了时,可以在catch中继续抛。
try {
throw new AException();
}
catch (AException e){
throw e//函数内throw
}
//如上传信息失败(服务器原因AException),将上传失败传给用户(BException)
如果该异常处理不了,但是并不属于该功能出现的异常。
可以将异常转换后,在抛出和该功能相关的异常。
或者异常可以处理,当需要将异常产生和本功能相关的问题提供出去,
让调用者知道,并处理。也可以将捕获异常处理后,转换新的异常。
try {
throw AException
}
catch (AException e)
{//如转账,出现问题
1.先对AException处理 ;将出现转账的问题解决,如将前退回用户。
2.thro new BException:告知用户转账失败。
}
RuntimeException
Exception中有一个特殊的子类异常RuntimeException
如果在函数中抛出该异常,函数上可以不用声明,编译一样通过
如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过。
之所以不用再函数上声明,是因为不需要让调用者处理(用户?)。
当该异常发生,希望程序停止,因为在运行时,出现了无法继续运算的情况,
希望停止程序后,程序员对代码进行修正。
自定义Runtime异常;如果该异常的发生,无法在继续进行运算,
就让自定义异常继承RuntimeExeption.;例如;负数异常
异常的注意事项:
在子类覆盖时:
1.子类抛出的异常必须是父类异常的子类或子集。
2.如果父类或借口没有抛异常,子类在覆盖时,只能try不能抛。
记住一点;catch是用于处理异常的,没有catch就代表异常没有被处理过,
如果该异常是检测(非runtime及其子类?)时的异常,那么必须声明
public void method(){
链接数据库;
try{
}
catch (){
数据操作;、
//throw new Exception(),如果用户操作时数据库发生异常,
//不可以将这个异常抛给用户(因为这是程序员的事情,用户处理不了),我们要抛给用户一个用户可以处理的异常
//如查找的信息不存在。这个用户可以处理的异常必须要抛,要让用户知道发生社么。
}
关闭数据;//该动作,无论数据操作是否成功,一定要关闭
}
异常在子父类覆盖中的体现;
1.子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类
2.如果父类方法抛出多个异常(ABCD),那么子类在覆盖该方法时,只能抛出父类异常的子集(<=ABCD)也可以自己处理。
3.如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,不可以抛出异常。
如果子类方法发生了异常,就必须要进行try处理,绝对不可以抛。
1.为什么子类的异常是父类或父类的子类?
如果父类抛了异常,别的类在调用该类的时候(show()),进行了try,catch处理。若子类在抛了
一个不是父类体系的异常,那多利用多态将子类传给show()时,异常无法处理。
//异常比if判断的好处,将正常代码于异常分离开来。
class fushuException extends Exception{
//自定义异常信息
private int value //获取异常的数值(负数)
private String msg;//这需要定义吗?????????,定义成员变量,给全局用。
fushuException(String msg){//构造函数不需要写返回值
this.msg= msg;
//super(msg)一条就够,定义在构造函数里
}
public String getMessage(){//覆盖getMessage()方法
return msg ;
}
}
class demo{
int div(int a,int b)throws fushuException{
if (b<0){
throw new fushuException("出现了负数的情况。。。by/fushu");//手动通过throw关键字抛出一个自定义异常,函数内出现异常,函数上必须声明
}
return a/b;
}
}
class day0909{
public static void main(String[] args){//throws Exception//在主函数上抛 抛给虚拟机
demo d = new demo();
try {
int x = d.div(4,-1);//div是用户输入的入口,要么捕捉,要么抛
System.out.println(x);
}
catch (fushuException e ){//抛什么处理什么
System.out.println(e.getMessage());
System.out.println("出现负数了");
}
System.out.println("over");
}
}
/*练习:
毕老师上课
问题;
电脑蓝屏
电脑冒烟
要对问题进行描述,封装对象
可是当冒烟发生后,出现讲课进度无法继续。
出现了讲师的问题:课时计划无法完成。也要描述
浙公网安备 33010602011771号