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 }
转载于:https://www.cnblogs.com/vilyo/archive/2012/08/08/2627558.html