站長資訊網
        最全最豐富的資訊網站

        java什么是異常?

        java什么是異常?

        什么是異常?

        結構不佳的代碼不能運行,這是Java的基本理念。

        發現錯誤的理想時機是在編譯期。然而,編譯器并不能發現所有的錯誤,余下的問題就需要在程序運行時解決。這就需要錯誤能通過某種方式,把適當的信息 傳遞給特定的接收者處理。

        Java中的異常處理的目的在于通過使用少量的代碼來簡化大型、可靠的程序的生成,通過此方式讓你的應用中沒有未處理的錯誤,而且它還帶來了一個明顯的好處:降低錯誤處理代碼的復雜度。

        異常,根據字面理解,有意外之意。把它置于代碼層面來理解,即阻止了當前方法或作用域繼續執行。異常是導致程序無法在其預期的執行中運行的事件。異常有三種類型——檢查異常、錯誤和運行時異常。

        在Java中,異常被當做對象來處理,其基類是Throwable。

        Java中的異常類型

        Java從Throwable直接派生出Exception和Error。其中Exception是可以拋出的基本類型,在Java類庫、方法以及運行時故障中都可能拋出Exception型異常。Exception表示可以恢復的異常,是編譯器可以捕捉到的;Error表示編譯時和系統錯誤,表示系統在運行期間出現了嚴重的錯誤,屬于不可恢復的錯誤,由于這屬于JVM層次的嚴重錯誤,因此這種錯誤會導致程序終止執行。Exception又分為檢查異常和運行時異常。

        異常類的結構層次圖如下:

        java什么是異常?

        典型的RuntimeException(運行時異常)包括NullPointerException, ClassCastException(類型轉換異常),IndexOutOfBoundsException(越界異常), IllegalArgumentException(非法參數異常),ArrayStoreException(數組存儲異常),AruthmeticException(算術異常),BufferOverflowException(緩沖區溢出異常)等;

        java什么是異常?

        非RuntimeException(檢查異常)包括IOException, SQLException,InterruptedException(中斷異常-調用線程睡眠時候),NumberFormatException(數字格式化異常)等。

        而按照編譯器檢查方式劃分,異常又可以分為檢查型異常(CheckedException)和非檢查型異常 (UncheckedException)。Error和RuntimeException合起來稱為UncheckedException,之所以這么 稱呼,是因為編譯器不檢查方法是否處理或者拋出這兩種類型的異常,因此編譯期間出現這種類型的異常也不會報錯,默認由虛擬機提供處理方式。除了Error 和RuntimeException這兩種類型的異常外,其它的異常都稱為Checked異常。

        java什么是異常?

        Java如何處理異常

        1、try-catch, try-finally, try-catch-finally

        對于checked類型異常,我們要么對它進行處理,要么在方法頭使用throws拋出。

        public static void createFile() throws IOException{     File file = new File("C:/test.txt");     if(!file.exists()){             file.createNewFile();     } } public static void main(String[] args) {     try {         createFile();     } catch (IOException ex) {         // handle exception here     } }

        關于catch需要注意的幾點:

        1)、參數的異常類型必須是Throwable類或者其子類。

        2)、從上往下的catch語句,其參數類型必須按照從子類到父類順序,因為一旦匹配到一個類型,就會忽略往后的catch。比如IOException必須放到Exception前面,否則編譯器會報錯。

        3)、可以有一個或者多個catch語句,甚至如果有finally語句的情況下,可以沒有catch語句,如try-finally。

        想要捕獲多個異常,可以使用多個catch語句,JDK7以后提供了另外一種方式:多重捕獲(multi-catch)。

        try{     // other code } catch (IOException | SQLException ex) {     throw ex;   }

        4)、不要忽略異常。空的catch塊會使異常達不到應有的目的,除非諸如關閉FileInputStream的時候,因為你還沒有改變文件的狀態,因此不必執行任何恢復動作,并且已經從文件中讀取到所需要的信息,因此不用終止正在進行的操作。

        關于finally需要注意的幾點:

        1)、finally中的代碼總是會被執行,除非在執行try或者catch語句時虛擬機退出(System.exit(1))。

        2)、finally塊可以做一些資源清理工作,如關閉文件、關閉游標等操作。

        3)、finally塊不是必須的。

        另外,如果在try和finally塊中都執行了return語句,最終返回的將是finally中的return值。

        2、異常鏈

        常常想要在捕獲一個異常后拋出另外一個異常,并且希望把原始異常信息保存下來,這就是異常鏈。在JDK1.4以后,Throwable子類在構造器 中可以接受一個cause對象作為參數,表示原始異常,通過這樣把原始異常傳遞給新的異常,使得即使在當前位置創建并拋出了新的異常,也能通過這個異常鏈 追蹤到異常最初發生的位置。

        但在Throwable子類中,只有Error, Exception, RuntimeException三類異常類提供了帶cause參數的構造器,其它類型的異常則需要通過initCause()方法。例如定義了CustomException類,可以這樣使用:

        CustomException cmex = new CustomException(); cmex.initCause(new NullPointerException); throw cmex;

        這樣一來,CustomException繼承自Exception或RuntimeException,就屬于自定義異常了。

        一般來說,自定義異常的作用有以下情形:

        1)、將檢查型異常轉換為非檢查型異常。

        2)、在產生異常時封裝上下文信息、定義異常碼、收集環境對象,有利于信息的傳遞。

        異常使用指南

        1、在知道該如何處理的情況下才捕獲異常。

        2、自定義異常類型,用以封裝所有的檢查型異常。

        3、在程序的邊界進行異常捕獲。如服務端相應客戶端的請求,在出口處catch內部有可能產生的異常,并統一throw一個封裝過的異常給客戶端,免得暴露服務端敏感信息。

        4、只針對異常的情況才使用異常。不要在所有的代碼中習慣性地使用try-catch,因為這會影響性能。

        5、拋出與抽象相對的異常。如果方法拋出的異常與它執行的任務沒有明顯的聯系,這種情形會使人不知所措。為了避免這個問題,更高層的實現應該捕獲 低層的異常,同時拋出可以按照高層抽象進行解釋的異常,這種做法被稱為異常轉譯(exception translation),如下:

        try{     // use lower-level abstraction to do our bidding } catch(LowerLevelException ex){     throw new HigherLevelException(...); }

        另外一種特殊的異常轉譯稱為異常鏈,上面已作描述。如果低層的異常對于調試導致高層異常的問題非常有幫助,使用異常鏈就很合適。高層的異常提供訪問方法(Throwable.getCause)來獲得低層的異常。

        6、每個方法拋出的異常要有文檔描述。利用Javadoc的@throws標記,記錄拋出每個異常的條件。如果一個方法可能拋出多個異常,不要使 用這些異常類的某個超類。如不要聲明一個方法“throws Exception”或“throws Throwable”,這將沒有任何指導信息。

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 久久99精品免费一区二区| 久久久久人妻一区精品性色av| 亚洲国产精品自产在线播放| 国内精品久久久久影院免费| 无码人妻精品一区二区在线视频| 久久精品一区二区影院| 欧美成人精品一级高清片| HEYZO无码综合国产精品227| 自拍偷自拍亚洲精品被多人伦好爽| 国产精品日日摸夜夜添夜夜添1国产精品va欧美精 | 国产精品美女久久久m| 亚洲AV无码乱码精品国产| 国产亚洲精品资在线| 99久久亚洲综合精品成人| 日本精品久久久中文字幕| 国产成人精品免费视频动漫| 精品国产乱码一区二区三区| 无码国产精品一区二区免费模式| 四虎国产精品永久地址入口| 久久99精品久久久久久水蜜桃| 国产精品亚洲欧美大片在线看| 国产高清在线精品一区小说| 93精91精品国产综合久久香蕉 | 亚洲精品白浆高清久久久久久| 无码日韩精品一区二区人妻| 久久人人爽人人精品视频| 国产精品一区三区| 精品精品国产理论在线观看| 国产亚洲精品国看不卡| 国内精品久久久久影院网站| 九九精品在线视频| 日韩人妻无码精品无码中文字幕| 久久精品国产精品亚洲艾草网美妙| 国产香蕉国产精品偷在线| 麻豆国产精品VA在线观看不卡| 欧美黑人巨大videos精品| 午夜亚洲av永久无码精品| 亚洲无码日韩精品第一页| 最新国产在线精品观看| 久久精品欧美日韩精品| 成人精品一区二区三区中文字幕 |