黑马程序员_异常

来源:互联网 发布:java中final 编辑:程序博客网 时间:2024/06/03 20:52

------- android培训java培训、期待与您交流! ---------- 

异常:

是在运行时期发生的不正常情况。

在java中用类的形式对不正常情况进行了描述和封装对象

描述不正常的情况的类,就称为异常类。

以前正常流程代码和问题处理代码相结合,

 现在将正常流程代码和问题处理代码分离////提高阅读性///

 

实质:其实异常就是java通过面向对象的思想将问题封装成了对象.

  用异常类对其进行描述。

不同的问题用不同的类进行具体的描述 ===》比如角标越界。空指针等等。

问题很多,意味着描述的类也很多。

||将其共性进行向上抽取,形成了 ==》异常体系

||最终问题(不正常情况)就分成了两大类

Throwable:无论是error,还是异常,问题,问题发生就应该可以抛出,让调用者知道并处理。

                           //该体系的特点就在于Throwable及其所有的子类都具有可抛性。

可抛性到底指的是什么呢?怎么体现可抛性呢?

                           其实是通过两个关键字来体现的。

                           throwsthrow ,凡是可以被这两个关键字所操作的类和对象都具备可抛性.

         |--1,一般不可处理的----Error

                           特点:是由jvm抛出的严重性的问题。

                                     这种问题发生一般不针对性处理。直接修改程序

         |--2,可以处理的----Exception【主要学习】

该体系的特点:

         子类的后缀名都是用其父类名作为后缀,阅读性很强 。

自定义异常:

注意:如果让一个类称为异常类,必须要继承异常体系,因为只有称为异常体系的子类才有资格具备可抛性

         才可以被两个关键字所操作,throws throw

异常的分类:

1,编译时被检测异常:

只要是Exception和其子类都是,除了特殊子类RuntimeException体系。

                  这种问题一旦出现,希望在编译时就进行检测,让这种问题有对应的处理方式。

                  这样的问题都可以针对性的处理。

2,编译时不检测异常(运行时异常):

就是Exception中的RuntimeException和其子类。

                  这种问题的发生,无法让功能继续,运算无法进行,更多是因为调用者的原因导致的而或者引            发了内部状态的改变导致的。

                           那么这种问题一般不处理,直接编译通过,在运行时,让调用者调用时的程序强制停止,让                    调用者对代码进行修正。

所以自定义异常时,要么继承Exception

   要么继承RuntimeException

throwsthrow的区别:

1,            throws使用在函数上。

                        throw使用在函数内。

         2,            throws抛出的是异常类,可以抛出多个,用逗号隔开。

                         throw抛出的是异常对象。

异常处理的捕捉形式:

这是可以对异常进行针对性处理的方式。

具体格式是:

try

{//需要被检测异常的代码。}

catch(异常类变量)//该变量用于接收发生的异常对象

{//处理异常的代码。}

finally

{//一定会被执行的代码。}

异常处理的原则:

1,函数内容如果抛出需要检测的异常:

--那么函数上必须要声明

                  --否则必须在函数内用try catch捕捉,否则编译失败。

2,如果调用到了声明异常的函数:要么try catch要么throws,---》否则编译失败。

3,什么时候catch,什么时候throws呢?

                  功能内容可以解决,用catch。

                  解决不了,用throws告诉调用者,由调用者解决 。

4,一个功能如果抛出了多个异常,那么调用时,必须有对应多个catch进行针对性的处理

                  内部又几个需要检测的异常,就抛几个异常,抛出几个,就catch几个。

5,多个catch,父类的catch放在最下面。

6,catch内,需要定义针对性的处理方式。不要简单的定义printStackTrace,输出语句。也不要不写。

7,当捕获到的异常,本功能处理不了时,可以继续在catch中抛出。

      如果该异常处理不了,但并不属于该功能出现的异常,可以将异常转换后,再抛出和该功能相             关的异常。或者异常可以处理,当需要将异常产生的和本功能相关的问题提供出去,让调用者             知道,并处理。也可以将捕获异常处理后,转换新的异常。

Try{Throw new AException();}

Catch(AException e){

Throw e;}

Try{Throw new AException();}

Catch(AException e){

//AException处理。

Throw new BException();

}//汇款例子

异常的注意事项:

1,  子类在覆盖父类方法时,父类的方法如果抛出了异常,

那么子类的方法只能抛出父类的异常或者该异常的子类。(流程可以看出:对象不一致。)

2,  如果父类抛出多个异常,那么子类只能抛出父类异常的子集。(子类异常少于父类异常)

注意:如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛,就只能try.(可以参想上面,无对象)

记忆模型:

------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------

毕老师用电脑上课:

|--问题领域中涉及两个对象:

|--毕老师----电脑。

|--分析其中的问题:

|--比如电脑蓝屏啦----冒烟啦

class LanPingException extends Exception{

         LanPingException(Stringmsg){

                  super(msg);

         }

}

class MaoYanException extends Exception{

         MaoYanException(Stringmsg){

                  super(msg);

         }

}

class NoPlanException extends Exception{

         NoPlanException(Stringmsg){

                  super(msg);

         }

}

class Computer{

         privateint state = 2;

         publicvoid run()throws LanPingException,MaoYanException{

                  if(state==1)

                           thrownew LanPingException("电脑蓝屏啦!!");

                  if(state==2)

                           thrownew MaoYanException("电脑冒烟啦!!");

                  System.out.println("电脑运行");

         }

         publicvoid reset(){

                  state = 0;

                  System.out.println("电脑重启");

         }

}

class Teacher{

         privateString name;

         privateComputer comp;

         Teacher(Stringname){

                  this.name = name;

                  comp = new Computer();

         }

         publicvoid prelect()throws NoPlanException{

                  try{

                           comp.run();

                           System.out.println(name+"讲课");

                  }

                  catch (LanPingException e){

                           System.out.println(e.toString());

                           comp.reset();

                           prelect();

                  }

                  catch (MaoYanException e){

                           System.out.println(e.toString());

                           test();

                           //可以对电脑进行维修。

//                         throwe;

                           thrownew NoPlanException("课时进度无法完成,原因:"+e.getMessage());

                  }

         }

         publicvoid test(){

                  System.out.println("大家练习");

         }

}      

class ExceptionTest {

         publicstatic void main(String[] args){

                  Teacher t  = new Teacher("毕老师");

                  try{

                           t.prelect();  

                  }

                  catch (NoPlanException e){

                           System.out.println(e.toString()+"......");

                           System.out.println("换人");

                  }

         }

}

 

class NoAddException extends Exception

{}

void addData(Data d)throws NoAddException{

         连接数据库

         try{

         添加数据。出现异常 SQLException();

         }

         catch(SQLExceptione){

                  //处理代码。

                  throw new NoAddException();

         }

         fianlly{

         关闭数据库。

         }

}



Fianlly:

格式:fianlly{}

其中语句是必须处理的,(除了关闭jvm==>System.exit(0);)

一般应用于关闭数据库连接使用或资源。


------- android培训java培训、期待与您交流! ---------- 

0 0