Java的基本理念是「結構不佳的程式碼不能運作」! ! ! ! !
大成若缺,其用上不弊。
大盈若衝,其用不窮。
在這個世界上不可能存在完美的東西,不管完美的思維有多麼縹密,細心,我們都不可能考慮所有的因素,這就是所謂的智者千慮必失。同樣的道理,電腦的世界也是不完美的,異常情況隨時都會發生,我們所需要做的就是避免那些能夠避免的異常,處理那些不能避免的異常。這裡我將記錄如何利用異常還程式一個「完美世界」。
首先我們可以明確一點就是異常的處理機制可以確保我們程式的健壯性,提高系統可用性。雖然我們不是特別喜歡看到它,但是我們不能不承認它的地位,作用。有異常表示程序有問題,有助於我們及時改正。在我們的程式設計當做,任何時候任何地方因為任何原因都有可能會出現異常,在沒有異常機制的時候我們是這樣處理的:透過函數的回傳值來判斷是否發生了異常(這個回傳值通常是已經約定好了的),呼叫該函數的程式負責檢查並且分析回傳值。雖然可以解決異常問題,但是這樣做有幾個缺陷:
1、容易混淆。如果約定回傳值為-11111時表示出現異常,那麼當程式最後的計算結果真的為-1111呢?
2、 程式碼可讀性差。將異常處理程式碼和程式碼混淆在一起將會降低程式碼的可讀性。
3、 由呼叫函數來分析異常,這要求程式設計師對函式庫函數有很深的了解。
在OO中提供的異常處理機制是提供程式碼健壯的強而有力的方式。 使用異常機制它能夠降低錯誤處理程式碼的複雜度,如果不使用異常,那麼就必須檢查特定的錯誤,並在程式中的許多地方去處理它,而如果使用異常,那就不必在方法呼叫處進行檢查,因為異常機制將保證能夠捕獲這個錯誤,並且,只需在一個地方處理錯誤,即所謂的異常處理程序中。這種方式不僅節約程式碼,而且把「概述在正常執行過程中做什麼事」的程式碼和「出了問題怎麼辦」的程式碼分開。總之,與先前的錯誤處理方法相比,異常機制使程式碼的閱讀、編寫和調試工作更加井井有條。 (摘自《Think in java 》)。
在初學時,總是聽老師說把有可能出錯的地方記得加異常處理,剛開始還不明白,有時候還覺得只是多此一舉,現在隨著自己的不斷深入,代碼編寫多了,漸漸明白了異常是非常重要的。
在《Think in java》中是指這樣定義異常的作用方法這裡一定要明確一點:異常代碼某種程度的錯誤,儘管Java有異常處理機制,但是我們不能以「正常」的眼光來看待異常,異常處理機制的原因就是告訴你:這裡可能會或已經產生了錯誤,您的程式出現了不正常的情況,可能會導致程式失敗! 那麼何時才會出現異常呢?只有在你目前的環境下程式無法正常運作下去,也就是說程式已經無法來正確解決問題了,這時它所就會從當前環境中跳出,並且拋出異常。拋出異常後,它首先會做幾件事。首先,它會使用new創建一個異常對象,然後在產生異常的位置終止程序,並且從當前環境中彈出對異常對象的引用,這時。異常處理機制就會接管程序,並開始尋找一個恰當的地方來繼續執行程序,這個恰當的地方就是異常處理程序,它的任務就是將程序從錯誤狀態恢復,以使程序要么換一種方法執行,要么繼續執行下去。 總的來說異常處理機制是當程序發生異常時,它強制終止程序運行,記錄異常信息並將這些信息反饋給我們,由我們來確定是否處理異常。 )。 從上面這張圖片中可以看出,Throwable是java中所有錯誤的超類語言(Throwable)即可。它有兩個子類別:Error、Exception。 其中Error為錯誤,是程序無法處理的,如OutOfMemoryError、ThreadDeath等,出現這種情況你唯一能做的就是聽之任之,交由JVM來處理,JVMDeath等,出現你唯一能做的就是聽之任之,交由JVM來處理,JVMDeath終止線程。 而Exception是程序可以處理的異常。它又分為兩種CheckedException(受撿異常),一種是UncheckedException(不受檢查異常)。其中CheckException發生在編譯階段,必須使用try…catch(或throws)否則編譯不通過。而UncheckedException發生在運行期,具有不確定性,主要是由於程式的邏輯問題所引起的,難以排查,我們一般都需要縱觀全局才能夠發現這類的異常錯誤,所以在程式設計中我們需要認真考慮,好好寫程式碼,盡量處理異常,即使產生了異常,也能盡量保證程式朝著有利方向發展。 所以:對於可恢復的條件使用被檢查的異常(CheckedException),對於程序錯誤(言外之意不可恢復,大錯異常已經釀成)使用運行時(RuntimeException)。 java的異常類實在是太多了,產生的原因也千變萬化,所以在部落格文章中經常整理! 四、異常使用 無論你發神馬脾氣,我都默默承受,靜靜處理。對初學者來說異常就是try…catch,(鄙剛接觸時也是這麼認為的,碰到異常就是try…catch)。個人感覺try…catch確實是用的最多也是最實用的。 在異常中try快包含可能出現異常的程式碼區塊,catch區塊捕捉異常後對異常進行處理。先看以下實例:收到圖摘自:
http://www.php.cn/
public class ExceptionTest {
public static void main(String[] args) {
String file = "D:\\exceptionTest.txt";
FileReader reader;
try {
reader = new FileReader(file);
Scanner in = new Scanner(reader);
String string = in.next();
System.out.println(string + "不知道我有幸能够执行到不.....");
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("对不起,你执行不到...");
}
finally{
System.out.println("finally 在执行...");
}
}
}
这是段非常简单的程序,用于读取D盘目录下的exceptionText.txt文件,同时读取其中的内容、输出。首先D盘没有该文件,运行程序结果如下:
java.io.FileNotFoundException: D:\exceptionTest.txt (系统找不到指定的文件。) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.<init>(FileInputStream.java:106) at java.io.FileInputStream.<init>(FileInputStream.java:66) at java.io.FileReader.<init>(FileReader.java:41) at com.test9.ExceptionTest.main(ExceptionTest.java:19) 对不起,你执行不到... finally 在执行...
从这个结果我们可以看出这些:
1、当程序遇到异常时会终止程序的运行(即后面的代码不在执行),控制权交由异常处理机制处理。
2、catch捕捉异常后,执行里面的函数。
当我们在D盘目录下新建一个exceptionTest.txt文件后,运行程序结果如下:
1111不知道我有幸能够执行到不..... finally 在执行...
11111是该文件中的内容。从这个运行结果可以得出这个结果:不论程序是否发生异常,finally代码块总是会执行。所以finally一般用来关闭资源。
在这里我们在看如下程序:
public class ExceptionTest { public static void main(String[] args) { int[] a = {1,2,3,4}; System.out.println(a[4]); System.out.println("我执行了吗???"); } }
程序运行结果:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4 at com.test9.ExceptionTest.main(ExceptionTest.java:14)
各位请注意这个异常信息和上面的异常信息错误,为了看得更加清楚,我将他们列在一起:
java.io.FileNotFoundException: D:\exceptionTest.txt (系统找不到指定的文件。) Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
在这里我们发现两个异常之间存在如下区别:第二个异常信息多了Exception in thread"main",这显示了出现异常信息的位置。在这里可以得到如下结论:若程序中显示的声明了某个异常,则抛出异常时不会显示出处,若程序中没有显示的声明某个异常,当抛出异常时,系统会显示异常的出处。
以上就是java提高篇(十六)-----异常(一)的内容,更多相关内容请关注PHP中文网(www.php.cn)!