跳至內容

Java/異常處理

維基教科書,自由的教學讀本

異常

[編輯]

Java提供了豐富的異常處理機制,與C語言相同,Java的異常處理也是包含在try, catch, finally三個塊中的,常見的異常處理方式如下:

try{
    // 可能产生异常的代码
} catch(IOException e){
    // IOException为输出输入异常,当产生的异常被捕捉后,该处代码将被执行
} finally {
    // 无论异常产生与否,该处代码始终将被执行
}

如果在程序中需要拋出異常,應使用throw關鍵字:

if(!file.exists()) {
    throw new FileNotFoundException("file not found");
}

方法裏拋出異常,應使用關鍵字throws:

public void get() throws Exception{
}

異常類

[編輯]

Java提供了專門的異常類,所有的異常類均應是java.lang.Throwable的子類。其中,主要分為兩大子類:

  1. java.lang.Error: 其子類表示了Java虛擬機的異常
  2. java.lang.Exception: 其子類表示了程序運行中的異常

Exception的子類還可以分為兩類:

  1. java.lang.RuntimeException: 其子類表示了運行中的異常,該異常可以不被catch,編譯器也能通過。該子類表示的異常,均應該在原始碼中避免,比如數組範圍的超出等等。
  2. 非RuntimeException: 其子類表示了程序中不可避免的異常,如文件不存在的FileNotFoundException異常,該異常必須被catch掉或者是在函數頭處聲明。

Assert

[編輯]

從1.4版本開始,java支持了assert關鍵字對異常的處理。一般形式如下:

assert 布尔表达式;
assert 布尔表达式字符串或表达式;

該語句表示,如果布爾表達式的值為假,則拋出AssertionError異常,如果採取第二種形式,則以後面的字符串或表達式的返回值作為構造器的輸入參數。該語句表達了,程序斷言此處布爾表達式為真,否則將會出錯。但在一般情況下,assert語句將被程序忽略掉,除非在java運行時指定。指定的形式如下:

java -ea MainApp

這個命令行參數-ea打開了assert斷言機制,而默認的情況是關閉的。


不同於普通的Exception異常,assert斷言一般是作為調試信息用的。比如,作為java包的設計者,對於包中private或包訪問限制的函數中所進行的判斷,就可以使用assert斷言作為額外的調試信息。而對於public和protected訪問限制的函數,其中的判斷就應該用Exception異常,因為這些函數是面向用戶的。