try、catch、finally詳細內容 https://github.com/tomlinNTUB/Java/wiki/%E7%AC%AC09%E8%AA%B2-%E7%94%A8try…catch%E8%99%95%E7%90%86%E4%BE%8B%E5%A4%96

引用筆記:https://medium.com/@clu1022/java%E7%AD%86%E8%A8%98-exception-%E8%88%87-error-dbdf9a9b0909

關於 Exception 與 Error 的基本概念

Exception 與 Error 都是繼承自 Throwable, 在 Java 的世界裡, 只有 Throwable 類型的 instance 才可以被 throw 或著 catch, 其為 exception handling 的基本組成類型. 至於 Exception 與 Error 的差異, 這部分就體現出了 Java 設計者對不同異常情境的分類:

  • Exception: 通常指程式運行時所出現的可預料之意外狀況, 基本上都要進行 catch 的動作, 然後進行相應處理, 如 IOException.
  • Error: 指在正常情況下, 不太可能出現的問題, 絕大部分的 Error 都會導致程式 (e.g. JVM 本身) 處於一種不正常且不可恢復的狀態. 所以對於這種情況, 你也不太需要去 catch 了, 因為也沒什麼意義. 常見的如 OutOfMemoryError / StackOverflowError 這些, 都是繼承自 Error.

再來, Exception 又可以分成兩類:

  • Checked Exception: 又稱受檢例外, 通常在原始碼中必須顯式地 catch 並且處理, 這部分算是 compile time 會檢查的部分.
  • Unchecked Exception: 又稱非受檢例外, 就是所謂的 RuntimeException, 常見的像是 NullPointerException, ArrayIndexOutOfBoundsException. 這種類型的例外通常是可以透過撰寫相應程式以避免的邏輯錯誤, 可以根據當下的情境來判斷是不是要 catch, 且在 compile time 並不會強制要求要 catch.
<p>public class trycatchfinallyDemo {

	public static void main(String[] args) {
//		使用方法
//		try{
//		 //這區塊為可能發生例外的敘述
//		}
//		catch(例外型態 變數名稱)
//		{
//		  //這區塊為例外發生的處理
//		}
//		finally {
//		    //這區塊為最後的處理
//		}
		
		int a=1;
		int b=10;
		
		try {
			int c=b/0; //數學裡面 數字除以0是無限大,是錯的,但是是執行時期才會顯示錯誤 ,一搬來說程式執行到這裡就會停下來,下面的就不會顯示了
		}	
//		catch 先把小的例外狀況,寫進catch裡面,然後再寫大的,就能比較容易明確知道是甚麼問題點
		catch(NumberFormatException e) {
			System.out.println("傳進 NumberFormatException的catch");
			System.out.println("只能為數值不得為字串");
			e.printStackTrace();
		}
		catch(Exception e)
		{
			System.out.println("傳進 Exception的catch");
			System.out.println(e);//列印出錯誤訊息
			e.printStackTrace();
		}
		finally {
			//這區塊為最後的處理 ,可有可無。
			System.out.println("測試二結束");
		}
		int height=0;
		String aa="bbb";
		 //基本型
		  int x = 5, y = 0;
		  //有發生Exception
		  try {
		   int result = x / y;
		   System.out.println("結果=" + result);
		  }
		  catch (Exception e) {
		   System.out.println("分母不可為0");
		  }
		  finally {
		   //這區塊為最後的處理 ,可有可無。
		   System.out.println("測試一結束");
		  }
		  //沒有發生Exception
		  try {
		   
		   int result = x + y;
		   System.out.println("1+0結果=" + result);
		  }
		  catch (Exception e) {
		   System.out.println("不可為0");
		  }
		  finally {
		   //這區塊為最後的處理 ,可有可無。
		   System.out.println("測試二結束");
		  }
		
	}

	}</p>

call stack和當if else使用

除了一般的使用以外,還可以用來另類當if else使用

//try catch finally用來分類錯誤,還有可以用來當if else使用

import java.util.Scanner;

public class CheckFieldDemo {

	public static void main(String[] args) {
		
		Scanner scanner=new Scanner(System.in);
		
		String id = scanner.next();
				checkfielmethod(id);//用另一個方法去執行內容,把ID傳進去這個method
	}
	
	private static void checkfielmethod(String id) {
		try{	
			String gender=id.substring(1,2);
			
		if(gender.equals("1")){
			System.out.println("男");
		}else if(gender.equals("2")){
			System.out.println("女");
		}else{
			throw new RuntimeException ("輸入錯誤!!");
		}
//call stack 呼叫堆疊,依照堆疊類別,由小而大排序Catch 到他所屬的錯誤類別的時候就會被Catch住
		}catch(StringIndexOutOfBoundsException e){
			System.out.println("輸入資料長度不足");
		}catch(NumberFormatException e){
			System.out.println("身份證第二碼應是數字");
		}
		catch(Exception e){
			System.out.println(e.getMessage());
		}
	}

}

 

Steven玄

謝謝您觀看本站內容!! 😅 西元93年台灣男,軟體前、後、資料庫工程師 和 多元收入實踐,程式設計、網站系統規劃、商業策略分析規劃、多元收入研究,目前在網站開發公司擔任工程師。

發佈留言