1. 程式人生 > >Java異常與處理機制

Java異常與處理機制

Java的異常層次體系

Java的所有異常物件都派生自Throwable類,下層有兩個分支:error和exception。

  • Error分支描述Java執行時系統內部錯誤或資源耗盡錯誤,遇到派生自Error的錯誤,程式除了通告給使用者並儘量安全退出外也無能為力。
  • Exception分支才是程式設計師主要在意的異常,它又分為RuntimeException和IOException兩個分支。
    1. RuntimeException通常是由於程式錯誤導致的。
    2. IOException通常程式本身沒有問題,但由於像I/O錯誤等問題導致的。

Java規範將Error分支和RuntimeException分支的異常稱為非受查異常,其他異常稱為受查異常。

丟擲異常

程式設計師在編寫程式碼時若遇到無法處理的情況(受查異常),可以選擇丟擲異常,將問題交給程式的呼叫者解決。

在方法名後用throws語句宣告異常告訴呼叫者程式碼會丟擲什麼異常,若需丟擲多個異常時就必須列出所有的異常類用逗號隔開。一個方法必須宣告所有肯丟擲的受查異常。例如:

public void read()throws FileNotFoundException,EOFException

在方法中使用throw語句丟擲異常,例如:

throw new IOException();

捕獲異常

丟擲異常是一種異常的解決方案,但不是最終方案。如果異常沒有得到處理程式就會崩潰終止,因此需要捕獲異常。Java提供了try/catch語句捕獲異常。

如果try語句中發生了異常,則停止執行try塊中的程式碼轉而執行catch塊中的程式碼,捕獲讀個異常時需為每個異常提供catch語句處理且catch語句自上到下要與異常繼承鏈相同由子到父,還可以合併catch語句用‘|’合併捕獲多個異常。

try {
  code
} catch (FileNotFoundException | UnknownHostException e) {
    exception handler
} catch (IOException e){
    exception handler
}

finally語句:若程式出現異常時,就會終止方法中剩餘的程式碼並退出方法。如果方法獲得了一些資源並且只有方法自己知道,就會產生資源回收問題。Java提出finally子句的解決方案,不管異常如何處理,finally子句一定會被執行。

處理異常時的幾種程式碼執行順序:

try{
    code1
    code that might throw exceptions
    code2
}catch(Exception e){
    code3
    code that might throw exceptions
    code4
}finally{
    code5
}
code6
  1. try塊程式碼無異常,執行順序為1,2,5,6
  2. try塊程式碼中出現異常,catch語句中沒有出現異常,執行順序為1,3,4,5,6
  3. try塊程式碼中出現異常,catch語句中也出現異常,執行順序為1,3,5

帶資源的try語句

對於實現了AutoCloseable或Closeable介面的資源,Java提供了帶資源的try語句,當try塊退出時,資源自動呼叫close()方法。

帶資源的try語句(try-with-resources)的形式為:

try(Resource res = ...){
    // code work with res
}

AutoCloseable介面有一個close方法,它丟擲一個Exception異常

void close() throws Exception;

Closeable介面繼承自AutoCloseable介面 也有一個close方法,它丟擲一個IOException異常

public void close() throws IOException;

斷言

在檢查受查異常時,通常會使用大量輸出語句進行測試,這些語句在測試完畢後依然會留在程式中,如果程式中留有這些大量的檢查語句會導致程式執行變慢。

在jdk1.4中引入了斷言機制,它允許在開發和測試階段在程式碼中插入一些檢查語句檢測異常。由於Java虛擬機器預設斷言是關閉的,因此在專案釋出後不影響程式的執行。

斷言的使用

  1. assert 條件;
  2. assert 條件:表示式;

當條件結果為false時,丟擲AssertionError異常,在第二種形式中表達式會傳入AssertionError類的構造器中形成一個訊息字串。

在測試中使用-enableassertions或-ea開啟斷言。

舉個栗子:

Scanner in = new Scanner(System.in);
int x = in.nextInt();
assert x>0:x;
double y = Math.sqrt(x);


如果文章有錯的地方歡迎指正,大家互相交流。感謝關注公眾號JsjCoding

相關推薦

Java異常處理機制

Java的異常層次體系 Java的所有異常物件都派生自Throwable類,下層有兩個分支:error和exception。 Error分支描述Java執行時系統內部錯誤或資源耗盡錯誤,遇到派生自Error的錯誤,程式除了通告給使用者並儘量安全退出外也無能為力。 Exception分支才是程式設計師主要在

java異常(Exception)處理機制詳解

java異常(Exception)處理機制詳解 目錄 一. 異常的定義  二. 異常掃盲行動  三. 異常的使用 例1. 這個例子主要通過兩個方法對比來演示一下有了異常以後程式碼的執行流程。 例2. 重新丟擲異常 例3. 異常鏈的使用及異常丟失 例

Java異常捕獲處理機制

在Java中,異常情況分為Exception(異常)和Error(錯誤)兩大類,Java異常通常是指程式執行過程中出現的非正常情況,如使用者輸入錯誤、除數為零、需要處理的檔案不存在、陣列下標越界等,對於異常情況的出現,可以採用異常處理,以保證程式可以正常的執行。 Java中定義兩種型別的異常和錯

java異常統一處理

出現 actor 錯誤 統一處理 type .get 。。 cfa getc 一般系統拋出的錯誤不含錯誤代碼,出去部分的404,500,400之外,我們如果想吧錯誤代碼定義的更細致,就需要自己繼承RuntimeExeption這個類後,重新定義構造方法定義自己的錯誤信息。

Java——異常捕獲

幾乎所有的程式碼裡面都會出現異常,為了保證程式在出現異常之後可以正常執行完畢,就需要進行異常處理。 異常的繼承類結構: 所有的異常都是由Throwable繼承而來。 Error類:描述Java執行時內部錯誤與資源耗盡錯誤。這種內部錯誤一旦出現,除了告知使用者並使程式安全終止之外,再

java異常情況處理

關於異常的全部說明,在api裡都可以查閱。 算術異常類:ArithmeticExecption 空指標異常類:NullPointerException 型別強制轉換異常:ClassCastException 陣列負下標異常:NegativeArrayException 陣列下標越界異常:ArrayI

java異常處理

轉載請標明文章的原出處 Java提高篇——Java 異常處理 異常的概念 異常是程式中的一些錯誤,但並不是所有的錯誤都是異常,並且錯誤有時候是可以避免的。 比如說,你的程式碼少了一個分號,那麼執行出來結果是提示是錯誤java.lang.Error;如果你用Syst

Java異常事物回滾探究

轉自 http://www.linuxidc.com/Linux/2014-03/98885.htm spring 事務註解 預設遇到throw new RuntimeException("...");會回滾 需要捕獲的throw new Exception("...")

SpringBoot異常統一處理機制

springboot官網說了三種異常處理,分為機器客戶端和瀏覽器客戶端,區別為機器客戶端請求返回的是頭中Accept是"/"或者空,異常返回值json,瀏覽器客戶端請求頭中Accept是"text/html" 返回的是html 如下圖: 機器客戶端: 瀏覽器客戶端: 下面

ASP.NET頁面的往返處理機制

 ASP.NET頁面的處理迴圈如下: 1、使用者通過客戶端瀏覽器請求頁面,頁面第一次執行。 2、Web伺服器上的ASP.NET對請求的頁面進行處理,翻譯成HTML和Javascript。 3、頁面將標記動態呈現到瀏覽器,瀏覽器對標記進行解析並顯示。 4、使用者鍵入資訊或從可選

JVM對Java異常處理原理

最初我們用 Java 寫 JSP 的時候,幾乎可以不觸及異常,因為 Servlet 容器會把 API 丟擲的異常包裝成 ServletException 丟給容器去處理。再後來應用分層,程式碼中要處理的異常便多了,一般會轉換成自定義的業務異常類,用 try-catch-t

struts2中的異常對映處理機制

首先在struts2中有兩種異常處理機制:區域性異常對映和全域性異常對映。 拿經典的使用者登入功能來說: 一:區域性異常: 1:首先我們的登入介面:表單交由exAction.action 處理。 &

介紹一下struts的異常自動處理機制

程式設計式異常處理 即我們在Action中呼叫業務邏輯層物件的方法時,用try{}catch的方式來截獲異常之後,手工對異常進行處理 我們以前的開發過程中,都是使用程式設計式的異常處理 在程式設計式異常處理的時候,我們可以使用struts的訊息處理機制來對這些異常資訊進行處

JVM 對Java異常處理原理

來看看上面程式碼中的 transfer() 方法相應的位元組碼指令,編譯器是 Eclipse 3.3.2 的,它所用的 JDK 是 1.6.0_06,編譯相容級別設定為 6.0。用命令 javap -c com.unmi.AboutCatch 在 Dos 視窗中就能輸出: public static voi

java的垃圾處理機制總結

虛擬機 方法 spa lock span 復制算法 算法 新生代 商業 GC回收java堆和方法區的內存,判斷對象是否存活采用可達性分析算法。 GC算法有四種:標記-清除算法、復制算法、標記-整理算法、分代收集算法,當前商業虛擬機都采用分代收集算法:新生代和老年代,其中新

SpringMVC異常處理機制

## SpringMVC異常的處理機制 ## 處理流程圖 **其本質還是把異常交給SpringMVC框架來處理** **系統的dao、service、controller出現異常都通過throws Exception向上丟擲,最後由springmvc前端控制器交由異常處理器進行異常處理。springmv

java 異常處理機制,throwsthrow,try-catch-finally

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

Java常見異常類含義異常處理機制

1. runtimeException子類: ArrayIndexOutOfBoundsException     陣列索引越界異常。當對陣列的索引值為負數或大於等於陣列大小時丟擲。 ArithmeticException     算術條件異常。譬如:整數除零

Java學習筆記之三十二】淺談Java中throwthrows的用法及異常拋出處理機制剖析

input auto void ref 淺談 .html ssa 不能 而是 異常處理機制 異常處理是對可能出現的異常進行處理,以防止程序遇到異常時被卡死,處於一直等待,或死循環。 異常有兩個過程,一個是拋出異常;一個是捕捉異常。 拋出異常 拋出異常有三種

java異常處理機制 throw拋出自定義業務邏輯異常 throws繼續拋出 catch捕獲後會自動繼續拋向調用方法

異常處理機制 ... cep super finally sta exc ace 避免 package com.swift; public class Exception_TestC { public static void main(String[] arg