---
# System prepended metadata

title: '**JAVA筆記(實務應用)**'
tags: [Java]

---

###### 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