异常 Exception

  1 异常是什么?
  2 是对问题的描述,想问题进行对象的封装、
  3 
  4 /*------------------------------------------------------------------------------------------------------------------------*/
  5 
  6 异常体系:
  7     Throwable
  8         |--Error
  9         |--Exception
 10             |--RuntimeException
 11 
 12 异常体系的特点:异常体系中的所有类以及建立的对象都具备可抛性。
 13                   也就是说可以被throw和throws关键字所操作
 14                   只有异常体系具备这个特点。
 15 
 16 /*------------------------------------------------------------------------------------------------------------------------*/
 17 
 18 throw 和 throws 的用法:
 19 throw 定义在函数内,用于抛出异常对象
 20 throws定义在函数上,用于抛出异常类,可以抛出多个,用逗号隔开
 21 
 22 当函数内有throw抛出异常对象,并未进行 try处理,必须要在函数上声明,否则编译失败
 23 注意, RuntimeException 除外,函数内如果抛出的是 RuntimeException 异常,函数上可以不用声明
 24 
 25 如果函数声明了异常,调用者需要进行处理,处理方式,可以 throws 可以try
 26 
 27 /*------------------------------------------------------------------------------------------------------------------------*/
 28 
 29 异常有两种:
 30     编译时被检测异常
 31         该异常在编译时,如果没有处理(没有throws也没try),那么编译失败
 32         该异常被标识,代表可以被处理
 33     运行时异常(编译时不检测),如 RuntimeException
 34         在编译时不需要处理,编译器不检查。
 35         该异常的发生,建议不处理,让程序停止,需要对代码进行修正。
 36 
 37 /*------------------------------------------------------------------------------------------------------------------------*/
 38 
 39 异常处理语句:
 40 try
 41 {
 42     需要被检测的代码;
 43 }
 44 catch ()
 45 {
 46     处理异常的代码;
 47 }
 48 finally
 49 {
 50     一定会执行的代码;
 51 }
 52 
 53 注意 
 54 1、 finally 中定义的通常是 关闭资源代码,因为资源必须要释放。
 55 2、 finally 只有一种情况不会执行,当执行到System.exit(0);时。这句话是使jvm关闭,所以他之后的代码都不会被执行
 56 
 57 /*------------------------------------------------------------------------------------------------------------------------*/
 58 
 59 自定义异常:
 60     定义类继承 Exception 或者 RuntimeException
 61     1、为了让该自定义类具备可抛性。
 62     2、让该类具备操作异常的共性方法
 63 
 64     当要定义自定义异常的信息时,可以使用父类已经定义好的功能。
 65     将异常信息传递给父类的构造函数
 66     class MyException extends Exception
 67     {
 68         MyException(String message)
 69         {
 70             super(message);
 71         }
 72     }
 73 
 74 自定义异常的好处:按照java的面向对象思想,将程序中出现的特有问题进行封装。
 75 
 76 /*------------------------------------------------------------------------------------------------------------------------*/
 77 
 78 异常的好处:
 79     1、将问题进行封装。
 80     2、将正常流程代码和问题代码进行分离,方便于阅读。
 81 
 82 /*------------------------------------------------------------------------------------------------------------------------*/
 83 
 84 异常的处理原则:
 85     1、处理方式有两种:try 或 throws
 86     2、调用到抛出异常的功能时,抛出几个,就处理几个。
 87         一个try对应多个 catch
 88     3、多个 catch ,父类的 catch 放到最下面
 89     4、 catch 内,需要定义针对性的处理方式,不要简单的printStackTrace,输出语句,也不要不写
 90         当捕获到的异常,本功能处理不了时,可以继续在 catch 中抛出,如:
 91         try
 92         {
 93             throw new AException();
 94         }
 95         catch (AException e)
 96         {
 97             throw e;
 98         }
 99         如果该异常处理不了,但并不属于该功能出现的异常,可以讲异常转换后,再抛出和该功能相关的异常。
100         或者异常可以处理,但需要将异常产生后和本功能相关的问题提供出去,让调用者知道并处理
101             也可以将捕获异常处理后,转换新的异常。
102         try
103         {
104             throw new AException();
105         }
106         catch (AException e)
107         {    
108             //对AException处理。
109             throw new BException();
110         }
111         比如,汇款的例子
112 
113 /*------------------------------------------------------------------------------------------------------------------------*/
114 
115 异常的注意事项:
116     在子父类覆盖时:
117     1、子类抛出的异常必须是父类异常的子类或者子集。
118     2、如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能在自己种try不能 throw 。
119 
120 /*------------------------------------------------------------------------------------------------------------------------*/
121 求圆形和矩形的面积
122 class WrongValueException extends RuntimeException
123 {
124     WrongValueException(String msg)
125     {
126         super(msg);
127     }
128 }
129 interface GetArea
130 {
131     void getArea();
132 }
133 class Rec implements GetArea
134 {
135     private int len;
136     private int wid;
137     Rec(int len,int wid)
138     {
139         if(len<0 || wid<0)
140             throw new WrongValueException("出现非法值!");
141         this.len = len;
142         this.wid = wid;
143     }
144     public void getArea()
145     {
146         System.out.println(len*wid);
147     }
148 }
149 class Cirle implements GetArea
150 {
151     private int r;
152     public static final double PI = 3.14;
153     Cirle(int r)
154     {
155         if(r<0)
156             throw new WrongValueException("出现非法值!");
157         this.r = r;
158     }
159     public void getArea()
160     {
161         System.out.println(r*r*PI);
162     }
163 }
164 class MyTest
165 {
166     public static void main(String[] args)
167     {
168             Rec r = new Rec(-3,4);
169             r.getArea();
170             Cirle c = new Cirle(5);
171             c.getArea();
172     }    
173 }
174   /*--------------------------------------------------------------------------------------------------------*/
175   看一个例子
176   老师上课,电脑可能会蓝屏或者坏掉
177   
178  class BlueScreenException extends Exception
179  {
180       BlueScreenException(String msg)//异常类的构造函数 传值msg是异常
181       {
182           super(msg);
183       }
184  }
185  class BrokenException extends RuntimeException
186  {
187      BrokenException(String msg)
188      {
189          super(msg);
190      }
191  }
192  class NoPlanException extends Exception
193  {
194      NoPlanException(String msg)
195      {
196          super(msg);
197      }
198  }
199  class Computer 
200  {
201      private int state = 1;//定义一个变量来表示状态,1是正常状态
202      public void run() throws BlueScreenException,BrokenException
203      {
204          if(state==2)
205              throw new BlueScreenException("电脑蓝屏了!");//当state==2时,电脑蓝屏,要抛出BlueScreenException
206          if(state==3)
207              throw new BrokenException("电脑坏了!");
208          System.out.println("电脑运行!");
209      }
210      public void reset()
211      {
212          state = 1;
213          System.out.println("电脑重启!");
214      }
215  }
216  class Teacher
217  {
218      private String name;
219      private Computer comp;//老师需要使用电脑,所以在老师类中定义并实例化一个电脑类
220      Teacher(String name)
221      {
222          this.name = name;
223          comp = new Computer();
224      }
225      public void jiangke()throws NoPlanException
226      {
227          try
228          {
229              comp.run();
230              
231          }
232          catch (BlueScreenException e)
233          {
234              System.out.println(e.getMessage());
235              comp.reset();
236          }
237          catch (BrokenException e)
238          {
239              throw new NoPlanException("课时无法继续!"+e.getMessage());//电脑坏了就没有办法讲课,于是抛出NoPlanException
240          }
241          System.out.println("开始上课");
242      }
243  }
244  
245  class Test
246  {
247      public static void main(String[] args)
248      {
249          Teacher t = new Teacher("老师");
250          try
251          {
252              t.jiangke();
253          }
254          catch (NoPlanException e)
255          {
256              System.out.println(e.toString());
257              System.out.println("换老师,或者放假!");
258          }
259          
260      }
261  }
posted @ 2012-08-08 01:41  viLyo  阅读(289)  评论(0)    收藏  举报