1. Error 和 Exception
-
异常指程序运行中出现的非预期状况,如:网络连接失败、非法参数等。
-
异常机制结构
- 检查型异常:通常由用户错误引起,程序员无法预见。
- 运行时异常:通常由程序逻辑引起,程序员可预见。
- 错误(ERROR):错误不是异常,是脱离程序员控制的问题,编译时也无法检查,往往是致命的。
2. 异常处理
-
捕获异常
-
使用
try
和catch
关键字可以捕获异常。try
代码块存放可能发生异常的代码,catch
代码块存放处理异常的代码。 -
catch
语句包含要捕获异常类型的声明(括号中的代码)。当try
代码块中发生一个异常时,catch
块就会被检查。 -
如果发生的异常包含在
catch
语句的异常类型的声明中,异常会被传递到该catch
块。try{ // 程序代码 }catch(ExceptionName e1){ // catch 块 }
-
-
多重捕获
-
一个
try
代码块后面可跟随多个catch
代码块进行多重捕获,异常的声明通常由小(范围)到大(范围)。try{ // 程序代码 }catch(异常类型1 异常的变量名1){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }catch(异常类型3 异常的变量名3){ // 程序代码 }
-
-
throw/throws
关键字-
throws
关键字放在方法签名的尾部,用来抛出检查该方法捕获的异常。 -
throw
关键字放在代码块之中,即可抛出新实例化的,也可以抛出刚捕获的。//随便扒了一个示例 public class className { public void withdraw(double amount) throws RemoteException, InsufficientFundsException { // Method implementation throw new RemoteException(); } //Remainder of class definition }
-
-
finally
关键字-
finally
关键字用来创建在try
代码块后面执行的代码块。 -
无论是否发生异常,
finally
代码块中的代码总会被执行。 -
在
finally
代码块中,通常存放清理类型等收尾善后性质的语句。try{ // 程序代码 }catch(异常类型1 异常的变量名1){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }finally{ // 程序代码 }
-
-
注意事项
注意下面事项:
catch
不能独立于try
存在。- 在
try/catch
后面添加finally
块并非强制性要求的。 try
代码后不能既没catch
块也没finally
块。try
,catch
,finally
块之间不能添加任何代码。
3. 自定义异常
-
步骤
- 创建自定义异常类,继承
Exception
。 - 通过
throw
抛出异常。 - 异常处理
- 在方法调用处使用
try/catch
捕获并处理。 - 在方法声明处使用
throws
抛给调用者异常信息,再做下一步处理。
- 在方法调用处使用
- 在出现异常方法的调用者处捕获并处理。
- 创建自定义异常类,继承
-
举个栗子
-
MyException.class
public class MyException extends Exception { //传递一个参数 private int num; public MyException(int num) { this.num = num; } //打印异常信息 @Override public String toString() { return "MyException:" + "num=" + num; } }
-
Test.class
public class Test { //可能存在异常的方法 static void test(int num) throws Exception{ //数字小于0抛出异常 if(num < 0){ throw new MyException(num); } System.out.println("无异常"); } //测试 public static void main(String[] args) { try { test(-1); } catch (Exception e) { System.out.println("异常 => " + e); } } }
-
4. 异常小结
- 处理运行时异常,采用逻辑合理规避或使用
try/catch
进行处理。 - 在多重
catch
块后,可以加一个catch(Exception e)
处理可能被遗漏的异常。 - 处理异常时,切忌只是调用
printStackTrace()
打印输出,要根据不同需求添加代码逻辑处理。 - 尽量添加
finally
语句释放资源。