###### tags: `Java` # **JAVA筆記(實務應用)** ## 例外處理機制 1~5 ### 模組1_Exception 目的為穩固使用(可發生例外的狀況下做判定並回應) #### 例外API層級架構 ![](https://i.imgur.com/MGQECdw.png) Error: 1.發生Error的話,程式會立刻中止 2.Error發生的原因多為系統層面 即便用程式碼也可能修復不了 Exception主要分以下兩種: 1.RuntimeException與其子類別 2.非RuntimeException相關的類別 PS:上圖僅為部分,非全部 #### try-catch try{ 正常處理程序的程式碼; }catch(Myexception e ){錯誤處理程序的程式碼; }catch(exception e ){錯誤處理程序的程式碼; } catch(a b) a為例外類型 b為例外物件(可自定義名稱) PS: 後面的catch從位階高者排在後面(父類別往後丟) ### 模組2_例外處理操作(1) #### finally 為一定會執行的程式碼 ex: try{A}catch{B}finally{C} 無論A或B路線,C一定會執行 通常用來釋放有限的資源,例如關閉DB連線,檔案讀取等 #### 受檢與非受檢例外 執行時期的例外 此類例外不一定要處理 因為這些例外發生的情況是程式設計師可以自行避免掉的 不必檢查的例外 ex:RunTime Exception及其子類別 非執行時期的例外 此類別必要處理 必須檢查之例外 例如:IOException、SQLException...等 #### 常見Runtime Exception介紹 詳見PG.130 ### 模組3_throws #### throws try_catch為明確處理(有內容解決) throws為消極處理(丟出錯誤訊息給其他方式處理) 方法定義時,用throws關鍵字將可能發生的例外,丟給呼叫此方法的程式去處理 用法如下: void method() throws MyException{...} 如有疑慮詳見PG.131 針對必要處理的例外,使用下列兩法其中之一: 1.將該方法置於try{}程式區塊中(背鍋) ex:TestThrows1.java 2.將該方法至於定義有throws關鍵字的方法中(繼續甩鍋) 此為在透過throws丟出例外,然後再由下一個呼叫者來處理 ex:TestThrow2.java 要注意throws後面所接的例外類型是否為必要例外,會影響編譯器判讀 #### throw 使用情境: 1.方法設計時,檢查參數有問題時就沒必要繼續執行 即可自行產生例外後丟出,強制結束該方法執行 2.搭配"自訂例外"使用 可透過thorw丟出錯誤內容 參考課本PG.132~134即可 ### 模組4_自訂例外 使用自訂例外類別時: 必須繼承Throwable或Exception或RuntimeException之一 自訂例外通常包含兩種建構子 public 建構子名稱(){} public 建構子名稱(String message){ super(message); } 程式內一樣可利用throw關鍵字,拋置此例外的catch區域處裡 若例外發生時,例外之後的程式碼皆不會執行,包括try當中的 ##### 拋出例外與覆寫關係 子類別覆寫其父類別訂有throws的方法時,子類別所throws的Exception必須與父類別一樣或更低階 EX:父類別使用RuntimeException,子類別不可使用Exception 錯誤只會越來越細而不是產生更大的例外 ### 模組5_改良例外處理 參考課本即可 補充:5-3Assert理論上會直接被忽略,測試(檢查)時使用 用途避免程式看起來很亂(與if相同,但if會造成程式冗長) #### 例外類型多重捕捉 catch括號內的例外類型不可有繼承關係 適用在這些例外沒有繼承關係外 且對這些例外都是相同處理做法 參考TestMultiCatch.Java (01_05) ## 資料I/O 6~12 File inputFile = new File("資料夾位置","檔名"); FileInputStream fis = new FileInputStream(inputFile); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); File r10 = new File("檔名"); int[] iarr = new int[10]; FileOutputStream fos = new FileOutputStream(r10, true); BufferedOutputStream bos = new BufferedOutputStream(fos); PrintStream ps = new PrintStream(bos); (Output此方法會只能出現英文) 若要中文的話需要用writer 層級參考(小到大) ### 模組6_File類別 java.io.File內提供java物件 可用於建立、移除、變更檔案屬性...等 File建構子不代表實際建立檔案(僅是Java中的物件) 需要透過使用才能進行建立修改編輯移除 常見建構子參照PG.140 常見方法參照PG.141 ### 模組7_I/O(1) #### Input/Output VS Reader/Writer 以上四種資料流類別內建於四個抽象父類別 我們使用JAVA已經實現好的子類別 不用去實作或繼承 InputStream/OutputStream為byte(8bits)為基礎,處理中文較困難 Reader/Writer為Char(16bits)為基礎,可處理Unicode(EX:中文) FileOutputStream/FileWriter接目的地檔案不存在的話, 會自動建立該名稱的檔案 ### 模組8_I/O(2) 為使用方便,JAVA依功能將I/O再分為: 低階I/O(專門負責跟"源頭"跟"目的地"相接用) 參考課本即可 ### 模組9_I/O(3) br.readLine() 一次存取一行(以\n做區隔) 只有BufferedReader才有 更有效率讀取資料 參考課本即可 如遇到big5文字檔(微軟),可透過fis>isr>fr>br來產生 參考CSVTest.java ### 模組10_I/O(4)_網路媒體 參考GetNatalieFromInternet.java TestGooglePlace.java 行22為連結URL 行28~行36為自訂緩衝區 參考課本即可 ### 模組11_文字主控介面I/O err的輸出會是紅色的 若想在資料流中取得資料長度 可使用fis.available(); 等同於File類別的file.length(); OutputStream與Writer中flush可強制將緩衝區未滿資料進行輸出,避免資料遺失 FileOutputStream與FileWriter在建構子第二個參數可以修改boolean參數(append) 改變其是否要保留舊有資料(預設為false) ture會新增在舊有資料之後 也可以使用在建構子時使用 ### 模組12_物件輸入與輸出 資料流類別建構子,若是有父類別資料流的參數 代表此為"高階資料流",因為是得搭配別的資料流才能使用 ObjectInOut 只要Java可以在classpath裡找到該類別即可,沒有規定一定得放在一起 (初階JAVA_模組28-3) 當物件可序列化時,內部的屬性(該類別)也需要能序列化,才能實現序列化之功能 transient與static不會被序列化 transient可成物件屬性但不會被序列化 static為類別屬性 可以透過serialVersionUID宣告為final將其固定版本 之後更新仍然可以運作 作為反序列化檢查來源的機制(安全的考量) 我們可以主動宣告此資料來固定UID值 以卻爆日後類別內容調整後,對反序列化的相容性ㄋ 詳見pg.157& ObjectInOut.java ## 集合API(資料結構) 13~20 ### 模組13_集合 集合不必指定大小,陣列需要指定 集合可以同時存放任何甚至不一樣的物件,陣列必須符合宣告 主要用List/Set Set>HashSet List>ArrayList 詳見課本為主 集合類別的toString皆有改寫(override) 主要作為對集合的觀察用途 ### 模組14_使用集合 參考課本 ### 模組15_Map Key and Value 參考課本 ### 模組16_泛型 可以透過<類別>宣告該資料的類別 可以提升安全性 讓該集合只能使用該類別的存取 ### 模組17_Iterable map相關集合無法使用foreach map沒有時做Iterable 但MAP中的keyset(),values()可以使用 因為keyset為set類,values為collection類 ### 模組18_集合進階版 可透過覆寫compareto,影響sort 透過覆寫equals,可影響是否類別是否相同的判斷(用於set.add(物件變數)使用) ### 模組20 佇列用法poll 會將內中資料取出 PriorityQueue會有自動排序的特性 內容需要有可比較性 Comparator介面 可暫時改變排序規則(避免更改JAVA原始碼或沒有原始碼可調整) 參考TestQueue.java TestPriorityQueue1.java TestPriorityQueue2.java ## 執行序 21~26 ### 模組21_繼承Thread使用 1.extpends Thread 2. override run() 3. 產生物件 4. object.start() object該為類別繼承Thread產生的物件 start為啟動run方法(啟動後執行下一行,且會增加一個執行緒) 而直接啟動run的話會等run跑完才換下一行程式碼 ### 模組22_Runnable介面及生命週期 1. implements Runnable 2.同上一模組(此處為時做Rummable的run方法) 3.產生物件 4.利用產生的物件再產生一個Thread的物件 Thread thr = new Thread(object); thr.start(); override run時不可覆寫Exception 因為run本身沒有Exception Exception的覆寫只能更細不能無中生有 執行緒預設為CPU及電腦掌控,非程式設計師掌控 因此 1.執行順序難以預測 2.執行期間隨時會有切換的狀況發生 參考TestThread.java MyThread.java的執行 ### 模組23_控制執行緒 join可用於控制執行緒的順序 常數可參考課本 ## 其餘介紹 27~36 ## Java8 37~42