1. 程式人生 > >Java異常處理體系

Java異常處理體系

       Java把所有非正常情況分為兩種:異常(Exception)和錯誤(Error),它們都繼承Throwable父類。

Error錯誤,一般是指與虛擬機器相關的問題,如系統崩潰、虛擬機器錯誤,動態連結失敗等,這種錯誤無法恢復,不可捕捉,將導致應用程式中斷。

       異常捕獲時,先捕獲小異常,再捕獲大異常。即所有父類異常的catch塊都應該排在子類異常catch塊的後面,否則編譯出錯。

Java7以前,每個catch塊只能捕獲一種型別的異常;從Java7開始,可以捕獲多中型別的異常。

(1)捕獲多種型別的異常時,多種異常型別之間用豎線( | )隔開;

(2)捕獲多種型別的異常時,異常變數有隱式的final修飾,因此不能對異常變數重新賦值。

捕獲一種異常時,異常變數沒有final修飾。

finally回收資源

不管try塊中的程式碼是否出現異常,也不管那個catch塊被執行,甚至在try和catch塊中都使用了return語句,finally塊總會被執行,除非在try塊執行之前,被return或者在finally塊之前呼叫了System.exit(1)語句退出虛擬機器。

Demo1:

  private static int test1() {
         int i = 1;
         try {
	            System.out.println("test1===========try...");
	            i = i+1;
	            return i;
	        } catch (Exception e) {
	            System.out.println("test1===========catch...");
	        } finally {
	            i++;
	            System.out.println("test1===========finally...");
	            System.out.println("test1===========i=" + i);
	        }
	   return i;
  }


結論:finally程式碼塊是在try程式碼塊中的return語句執行之後,返回之前執行的。

Demo2:

@SuppressWarnings("finally")
private static int test2() {
        int i = 1;
        try {
            System.out.println("test2===========try...");
            return i += 1;
        } catch (Exception e) {
            System.out.println("test2===========catch...");
        } finally {
            i++;
            System.out.println("test2===========finally...");
            System.out.println("test2===========i=" + i);
            return i;
        }
}

結論:finally程式碼塊中的return語句會覆蓋try程式碼塊中的return語句。

Demo3:

private static HashMap<String, String> test3() {
	HashMap<String, String> map = new HashMap<String, String>();
        map.put("key", "init");
        try {
            System.out.println("test3===========try...");
            map.put("key", "try");
            return map;
        } catch (Exception e) {
            System.out.println("test3===========catch...");
            map.put("key", "catch");
        } finally {
            System.out.println("test3===========finally...");
            map.put("key", "finally");
            map=null;
        }
	return map;
}

對比Demo1和Demo3發現

如果finally語句中沒有用return語句覆蓋返回值,那麼原來的返回值可能因為finally塊裡的修改而改變也可能不變。傳值型別的返回值:不變;傳址型別的返回值:會變。傳值:8種基本資料型別及其包裝類,字元常量。傳址:陣列和物件。

在Demo3中的finally塊中我把map設定為null,為什麼返回的值還是“test3={key=finally}”?

程式在執行到try{}語句中的return方法後,就會先返回相應的值,並把相應的值(map的引用地址值)儲存在一個臨時棧中去儲存這個結果。在finally執行完後,方法全部執行完,這時會再次呼叫return方法,這時不在是返回值,而是告訴主調程式,被調程式已經執行完了,可以接著去執行主程式中的其它方法了。此時返回的值還是原來儲存在臨時棧中的值,所以map的不是null。

Demo4:

try塊,finally塊沒有返回值的時候,程式碼順序執行


相關推薦

Java異常處理體系

       Java把所有非正常情況分為兩種:異常(Exception)和錯誤(Error),它們都繼承Throwable父類。 Error錯誤,一般是指與虛擬機器相關的問題,如系統崩潰、虛擬機器錯

Java 異常處理和 Log4j 配置文件

images orm 信息 not bound img source jar 下標 一、 程序錯誤 警告:黃線:Warning 錯誤:資源類:系統級(線程)/ 環境級(繪圖) 異常:編譯級:Exception 運行級:Exception -> RuntimeExc

15. Java異常處理

ace hover 避免 構造函數 裏的 width 原因 sans 克隆對象 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,addre

java異常處理

並不是 9.png 代碼塊 可能 函數 處理異常 finall int 將不 一 異常: 是指程序運行的過程中,發生某些意外的事情,比如10除以0, 文件不存在等。 例如: pub

項目中java異常處理

tails 驗證 包含 erro csdn 拋出異常 項目 cep ble 一、java異常類介紹。 Throwable: 有兩個重要的子類:Exception(異常)和 Error(錯誤),二者都是 Java 異常處理的重要子類,各自都包含大量子類。 有一篇比較好的b

Java 異常處理

nal fbo 失敗 類定義 參數 方法 ray 接下來 語法檢查 閱讀目錄 異常的概念 異常的體系結構 Java 異常的處理機制 異常處理的基本語法 異常鏈 自定義異常 總結 回到頂部 異常的概念 異常是程序中的一些錯誤,但並不是所有的錯誤都是異常,並且錯誤有時候

實習培訓——Java異常處理(8)

如何工作 出了 我們 個數 試圖 類對象 bject epo 很多 實習培訓——Java異常處理(8) Java 異常處理 異常是程序中的一些錯誤,但並不是所有的錯誤都是異常,並且錯誤有時候是可以避免的。 比如說,你的代碼少了一個分號,那麽運行出來結果是提示是錯誤 java

Java——異常處理

上一個 分別是 類型轉換 冒號 意思 參數 ack span log 1、java提供的異常不可能預見所有的問題,所以需要自己定義異常類,必須從已有的異常類繼承,最好選擇意思相近的異常類繼承。 class MyException extends Exception{}

Java - 異常處理

一個 普通 throw oid 基類 語句 內容 推薦 出現 主要內容: * Java 異常的概念。 * Java 異常的分類。 * 異常的捕獲和處理。 Q:Java 是如何對異常進行處理的? A:Java 中定義了很多異常類,這些類對應了各種各樣可能出現的異常事

java異常處理的機制 java 架構師學習 java北京

語句 變量 point try ray 多重 span throw 創建 在Java中,異常情況分為Exception(異常)和Error(錯誤)兩大類,Java異常通常是指程序運行過程中出現的非正常情況,如用戶輸入錯誤、除數為零、需要處理的文件不存在、數組下標越界等,對於

Java入門提高篇】Day16 Java異常處理(下)

http final 自定義異常 2個 輸入 也有 推薦 錯誤 num   今天繼續講解java中的異常處理機制,主要介紹Exception家族的主要成員,自定義異常,以及異常處理的正確姿勢。 Exception家族   一圖勝千言,先來看一張圖。   Excepti

Java 異常處理的誤區和經驗總結

ORC 進一步 相關 ror final 額外 檢測 業務 清理資源 一 異常分檢測異常和非檢測異常,異常的應用情景可以概括為以下: 調用代碼不能繼續執行,需要立即終止。出現這種情況的可能性太多太多,例如服務器連接不上、參數不正確等。這些時候都適用非檢測異常,不需要調用

程序設計中關於Java 異常處理應註意的問題

異常處理 try...catch Java 異常處理初識 下面程序,雖能運行,但當數據輸入有誤時程序不能正常結束,也就是說,程序本身沒有進行異常處理。 例題001 用Java編寫程序。輸入兩個整數,輸出它們的商。 import java.util.Scanner;public class MyAd

深入理解Java異常處理機制 (籠統篇)

throw 種類型 綜合 IV 算術 其它 wid all 作用 開篇 1.異常處理(Exception Handling):   就是一種解決這一問題的機制,能夠較好地處理程序不能正常運行的情況。 2.異常(Exception):   是程序在運行時可能出現的

每日一題:Java異常處理

增加 異常處理 int throwable 邏輯 現實 inter throws 運行時 什麽是異常 在理想情況下,程序總會運行在很完美的環境中,網絡不會終端,文件一定存在,程序不會有 BUG。但是,理想很豐滿,現實很骨幹,實際生產環境中,網絡可能會中斷,文件可能會找不到,

Java異常處理總結

tst error 有一個 ror 而是 阻止 cep 行處理 編碼 一、Java 異常繼承框架 Error: Error類對象由 Java 虛擬機生成並拋出,大多數錯誤與代碼編寫者所執行的操作無關。對於設計合理的應用程序來說,即使確實發生了錯誤,本質上也不應該試圖去處理

java異常處理中的return和throw

如果把return和throw放在一起,直接會提示錯誤。"Unreachable statement"(無法被執行). 然而finally卻可以成功騙過編譯器讓兩者並存(是不是可以算是編譯器的一個小bug呢),結果是後執行的會覆蓋前者。 finally如果有return會覆蓋cat

java 異常處理之宣告丟擲異常

java 異常處理宣告丟擲異常 2.宣告丟擲異常是Java中處理異常的第二種方式 2.宣告丟擲異常是Java中處理異常的第二種方式 如果一個方法(中的語句執行時)可能生成某種異常,但是並不能確定如何處理這種異常,則此方

java 異常處理機制,throws與throw,try-catch-finally

java 異常處理機制 1.Java異常處理 2.try-catch-finally的程式流程圖 3.關鍵解讀 4.demo 5.不捕獲異常時的情況 在編寫程式時,經常要在可能出現錯誤的地方

java 異常處理方式之一 try—catch——finally

java 異常處理方式之一: try—catch——finally 1. 如何處理Exception的異常 2. 注: 3.dome 1. 如何處理Exception的異常 Java提供的是異常處理的抓拋模型為