异常 Exception

it2026-03-07  8

1 异常是什么? 2 是对问题的描述,想问题进行对象的封装、 3 4 /*------------------------------------------------------------------------------------------------------------------------*/ 5 6 异常体系: 7 Throwable 8 |--Error 9 |--Exception 10 |--RuntimeException 11 12 异常体系的特点:异常体系中的所有类以及建立的对象都具备可抛性。 13 也就是说可以被throw和throws关键字所操作 14 只有异常体系具备这个特点。 15 16 /*------------------------------------------------------------------------------------------------------------------------*/ 17 18 throwthrows 的用法: 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、处理方式有两种:trythrows 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不能 throw119 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

最新回复(0)