異常的感性認識html
在沒有異常機制的語言中,常常經過返回值來表示調用該函數產生的各類問題(異常),好比c語言.java
divide.c程序員
#include <stdio.h> int main() { if (-1 == divide(1, 1)) { printf("除數不能爲0.\n"); } } int divide(int divident, int divisor) { //若是除數爲0,則返回-1 if (0 == divisor) { return -1; } //若是除法不爲0,則返回0 printf("%d\n", divident/divisor); return 0; }
在java中,經過它的異常處理機制,能夠對異常進行處理.ide
Divide.java函數
public class Divide { public static void main(String[] args) { //把有可能產生異常的句子放在try{}語句中 try { divide(1, 0); } //經過catch(){}語句對異常進行處理. 注意:能夠有多個catch(){}語句,由於有多個異常嘛 catch(Exception e) { e.printStackTrace(); } //finally{}裏面的程序塊,不管有沒有異常,都會執行,多用於關閉資源.(..粗俗的說,也能夠說是插屁股的") //注: finally{}能夠省略,但try{} catch(){}不行! finally { System.out.println("白白"); } System.out.println("注意:對異常處理以後,後面的句子仍舊執行."); } public static int divide(int i, int j) { int result = i / j; return result; } }
異常的類型this
如上圖:(來源http://www.cnblogs.com/vamei/archive/2013/04/09/3000894.html)spa
橙色的表示不能夠處理的異常, 藍色的表示能夠處理的異常.code
其中,htm
Error(以及其衍生類)是系統錯誤(好比 內存不足, java內部錯誤等等), 這個咱們程序員是沒法處理的.對象
Exception下的衍生類 "RuntimeException", 這個是java程序自己有問題,也就是"bug"形成的. 好比"NullPointerException", "IndexOutOfBoundsException", "ClassCastException"等等. 若是出現這些異常, 首先不是"try catch", 而是檢查本身代碼是否出問題了
繼承了Exception又不是RuntimeException的子類,也就是上圖藍色部門的異常,咱們就須要處理了.這些異常每每是在與用戶交互的時候產生的,好比用戶想要讀取一個不存在的文件, 這個時候,就會出現"FileNotFoundException"異常. 這個咱們就必須處理了
總結:拋出異常對象(throw), 不對異常進行處理,將異常交給上層處理(throws),本身處理異常(try catch)
Demo.java
/* Exception in thread "main" java.lang.Exception: w的值不能爲負數! * at Cup.test(Demo.java:32) * at Cup.addWater(Demo.java:16) * at Demo.main(Demo.java:4) */ public class Demo { public static void main(String[] args) throws Exception { Cup cup = new Cup(); cup.addWater(-1.0); } } class Cup { private double water = 0.0; private double maxWater = 100.0; //杯子的最大容量爲100.0ml public void addWater(double w) throws Exception { test(w); //若是要加的水+原本擁有的水的體積小雨水杯的最大容量,那麼就 "this.water = w + this.water" //不然,水溢出,直接設置 water = 最大容量 100ml便可 if (w + this.water < maxWater) { this.water = w + this.water; } else { this.water = 100.0; } } //檢查w的值是否正確,也就是檢查w是否是整數 public void test(double w) throws Exception { if (w < 0) { Exception e = new Exception("w的值不能爲負數!"); throw e; } 總結:拋出異常對象(throw), 不對異常進行處理,將異常交給上層處理(throws),本身處理異常(try catch) } }
自定義異常
DIYException.java
public class DIYExcetpion extends Exception { public DIYException(){} //在自定義異常的時候,要選擇更具體的類,這樣會包含更多的異常信息 public DIYException(String message) { super(message); } }