java異常體系結構詳解

前幾天在參加網易和360公司的在線考試的時候,都出了一道關於java中異常類的多項選擇題。這幾天翻看了相關書籍和網上一些資料,結合本身的理解與思考,將本身的一些收穫記錄以下:java

先來看看java中異常的體系結構圖解:服務器


首先說明一點,java中的Exception類的子類不單單只是像上圖所示只包含IOException和RuntimeException這兩大類,事實上Exception的子類不少不少,主要可歸納爲:運行時異常與非運行時異常。網絡

一java異常體系結構socket

從上述圖示能夠看到,spa

 Thorwable類(表示可拋出)是全部異常和錯誤的超類,兩個直接子類爲Error和Exception,分別表示錯誤和異常。其中異常類Exception又分爲運行時異常(RuntimeException)和非運行時異常,  這兩種異常有很大的區別,也稱之爲不檢查異常(Unchecked Exception)和檢查異常(Checked Exception)。下面將詳細講述這些異常之間的區別與聯繫:線程

一、Error與Exception
    Error是程序沒法處理的錯誤,它是由JVM產生和拋出的,好比OutOfMemoryError、ThreadDeath等。這些異常發生時,Java虛擬機(JVM)通常會選擇線程終止。
    Exception是程序自己能夠處理的異常,這種異常分兩大類運行時異常和非運行時異常。程序中應當儘量去處理這些異常。
二、運行時異常和非運行時異常
    運行時異常都是RuntimeException類及其子類異常,如NullPointerException、IndexOutOfBoundsException等,這些異常是不檢查異常,程序中能夠選擇捕獲處理,也能夠不處理。這些異常通常是由程序邏輯錯誤引發的,程序應該從邏輯角度儘量避免這類異常的發生。
    非運行時異常是RuntimeException之外的異常,類型上都屬於Exception類及其子類。從程序語法角度講是必須進行處理的異常,若是不處理,程序就不能編譯經過。如IOException、SQLException等以及用戶自定義的Exception異常,通常狀況下不自定義檢查異常。code

二異常的捕獲和處理ip

異常處理的步驟:作用域

throw  try catch finally throws下面是在網絡通訊中運用socket的一段代碼:虛擬機

<span style="white-space:pre">					</span>try {
						mSocket=new Socket(ip,port);
						if(mSocket!=null)
						{
						    Log.i("Client","socket is create");
							clientInput=new ClientInputThread(mSocket);
							clientOutput=new ClientOutputThread(mSocket);
							clientInput.setStart(true);
							clientOutput.setStart(true);
						
							clientInput.start();
							clientOutput.start();
							
						}
						else {
							Log.i("Client","socket is not create");
						//	Toast.makeText(, "親,服務器端鏈接出錯",0).show();
						}
					} catch (UnknownHostException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
						
					}finally{}

從上述代碼能夠看到異常處理的步驟爲


二、 try、catch、finally三個語句塊應注意的問題
    第一:try、catch、finally三個語句塊均不能單獨使用,三者能夠組成 try...catch...finally、try...catch、try...finally三種結構,catch語句能夠有一個或多個,finally語句最多一個。
    第二:try、catch、finally三個代碼塊中變量的做用域爲代碼塊內部,分別獨立而不能相互訪問。若是要在三個塊中均可以訪問,則須要將變量定義到這些塊的外面。
    第三:多個catch塊時候,最多隻會匹配其中一個異常類且只會執行該catch塊代碼,而不會再執行其它的catch塊,且匹配catch語句的順序爲從上到下,也可能全部的catch都沒執行。
      第四:先Catch子類異常再Catch父類異常。
用示意圖表示以下:



三、throw、throws關鍵字
    throw關鍵字是用於方法體內部,用來拋出一個Throwable類型的異常。若是拋出了檢查異常,則還應該在方法頭部聲明方法可能拋出的異常類型。該方法的調用者也必須檢查處理拋出的異常。若是全部方法都層層上拋獲取的異常,最終JVM會進行處理,處理也很簡單,就是打印異常消息和堆棧信息。throw關鍵字用法以下:

public static void test() throws Exception
{
   throw new Exception("方法test中的Exception");
}

  throws關鍵字用於方法體外部的方法聲明部分,用來聲明方法可能會拋出某些異常。僅當拋出了檢查異常,該方法的調用者才必須處理或者從新拋出該異常。當方法的調用者無力處理該異常的時候,應該繼續拋出.



注意一個方法throws出某個異常可是該方法內部能夠不throw出該異常,代碼以下:

class ER extends RuntimeException
{

}
class SomeClass
{
	public void fun()throws ER
	{
		System.out.println("AAAA");
		
	}
}

public class ExceptionTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SomeClass A=new SomeClass();
		A.fun();
	}
}
程序運行結果以下:AAAA。
相關文章
相關標籤/搜索