Java異常之throw,throws和Throwable

Java異常處理中有throw開頭的三兄弟,分別是throw,throws以及Throwable,那麼他們之間到底怎麼區分呢,且聽我慢慢道來。

Throwable

Throwable是一個類,該類被異常類Exception以及錯誤類Error繼承,其主要結構如下:

Throwable
       |-- Error 嚴重錯誤,如棧溢出,內存溢出等
       |-- Exception
            |- - CheckedException 可查異常,若不加處理,編譯不通過
            |- - RuntimeException 運行時異常,可以進行編譯

Java異常分爲兩種,一種是可查異常,即必須通過處理才能夠進行編譯,如FileNotFoundException等;另外一種是運行時異常,可以不用對其進行處理就能夠編譯,例如數組下標越界、除0等異常。

因此,Throwable作爲所有異常的超類,在不知道發生何種異常的時候,可以直接使用Throwable來代替Exception或者各種具體的異常類。

throws

throws的作用是在方法聲明的後面指明該方法可能會拋出異常(並不一定真的會出現異常)。如果在執行這個方法時出現異常,那麼這個方法就不再執行了,而是拋出一個異常,把這個異常拋給調用他的方法,並且讓調用他的那個方法去處理。

結合一段代碼進行分析:

	public static void method1() {
		try {
			method2();
		}catch(Exception e) {
			System.out.println("failed");
		}
	}
	
	public static void method2() throws FileNotFoundException{
		File f = new File("1.txt");
		System.out.println("試圖打開文件");
		new FileInputStream(f);
		System.out.println("打開文件成功");
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		method1();		
	}

根據上面的代碼,在定義method2時,通過throws指明該方法可能會拋出FileNotFoundException異常。首先main函數調用method1,method1調用method2,而method2中文件f並不存在,因此在new FileInputStream(f)這行代碼拋出異常,method2終止,並把這個拋出的異常甩鍋給method1 。而此時,method1剛好可以catch住這個異常,異常就被處理掉了,得到的結果如下:
在這裏插入圖片描述

throw

與throws不同,throw是一定會拋出一個異常,而且是在方法體內部使用。之前所說的異常類對象,都是JVM自動進行實例化的;有時候用戶想要親自實例化異常類對象,那麼這個時候throw就登場了。先看一段代碼:

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			throw new FileNotFoundException();
		}catch(Throwable e){
			System.out.println("File not found");
		}
	}

該代碼比較簡單,在catch中通過throw,直接實例化了一個異常類FileNotFoundException的對象,通過catch接住,並進行輸出,得到的結果如下:
在這裏插入圖片描述

總結

Throwable是所有異常類的超類,Exception和Error兩個類直接繼承它;

throws寫在方法聲明的後面,表明這個方法可能會拋出某種異常;

throw寫在方法體內部,手動拋出一個異常。

發佈了38 篇原創文章 · 獲贊 87 · 訪問量 7308
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章