首页 > 代码库 > 异常机制

异常机制

1 异常概述

异常:是运行时期放生的不正常情况

 

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

 

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

 

以前正常流程代码和问题处理代码相结合,现在将正常流程代码和问题处理代码分离,提高阅读性。

 

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

 

用异常类对其进行了描述。

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

 

2异常体系

 

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

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

 

最终问题分成了两大类。

 

Throwable  无论是错误还是异常,问题发生就可以抛出,让调用者知道并处理

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

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

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

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

  ---1 - 一般不可以处理的 Error

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

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

 

 ----2  可以处理的 Exception

 

该体系的特点在于子类的后缀名都是用其父类名作为后缀,阅读性很强。

 

 

3 自定义异常的抛出

如果某种异常在java体系中未定义 让一个类称为异常类,就必须继承异常体系,这样才具备可抛性。

 

Class MyException extends Exception

{

 MyException()

{

 

}

 

MyException(String msg)

{

 

Super(msg);

}

 

 

 

 

 

}

 

 

4 编译时被检测异常和运行时异常

编译时被检测异常 只要是Exception和其子类,除了RuntimeException

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

 这样的问题都可以针对性处理。以保证程序继续运行

   

 

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

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

 

 

5异常捕捉 try catch

异常处理的比浊形式

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

 

具体格式是

Try

{

 需要被检测异常的代码

}

Catch{异常引用}  //该变量用于接收发生的异常对象

{

处理异常的代码

}

Finally

{

 

}

 

6catch

 

7异常组合

1 try catch  finally

 

2try catch1 catch1

 

3try finally(异常抛出去,不在这里处理)

 

 

 

 

8 异常例子

package ExceptionDemo;

 

/*

 * 老师用电脑上课

 *

 * 问题领域中涉及两个对象 老师和电脑

 *

 * 分析其中的问题 比如电脑蓝屏 冒烟   (异常的转换)

 *

 */

 

class NoPlanException extends Exception

{

NoPlanException(String msg)

{

super(msg);

}

 

}

 

class LanPingException extends Exception

{

public LanPingException(String msg) {

   super(msg);

}

}

 

class MaoYanException extends Exception

{

public MaoYanException(String msg) {

   super(msg);

}

}

   class Computer

   {

   private int state=2; //电脑状态

   public void run() throws MaoYanException, LanPingException

   {   

   if(state==1)

   throw new LanPingException("电脑蓝屏啦");

   if(state==2)

   throw new MaoYanException("电脑冒烟了");

   System.out.println("computer run");

   }

   

   public void reset()

   {  

   this.state=0;

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

   }

   }

   

   class Teacher

   {

   private String name;

   private Computer comp;

   Teacher(String name)

   {

   this.name=name;

   comp=new Computer();

   }

   

public void test()

{

System.out.println("做练习");

}

   public void prelect() throws MaoYanException, NoPlanException

   {

   try {

comp.run();

  System.out.println("老师讲课");

} catch (MaoYanException e) {

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

test();  //可以对电脑进行维修

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

 

} catch (LanPingException e) {

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

comp.reset();

prelect();

}

 

 

   }

   }

 

 

 

 

class ExceptionTest

{

public static void main(String[] args) {

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

 

try {

t.prelect();

} catch (MaoYanException e) {

 

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

}

catch(NoPlanException e)

{

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

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

}

 

}

}

 

9 异常注意事项

 

1 子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类

 

2 如果父类抛出多个异常,那么子类只能抛出父类异常的子集

 

 

3 如果父类的方法法没有抛出的异常,那么子类覆盖时绝对不能抛

异常机制