20155233 2016-2017-2 《Java程序設計》第5周學習總結
學習目標
- 理解異常架構
- 牚握try...catch...finally處理異常的方法
- 會用throw,throws
- 理解Collection和Map架構
- 會用常見的數據結構和算法
- 了解Lambada和泛型
教材學習內容總結
第八章:
- try catch finally中所有錯誤都會被打包為對象。如果某個方法聲明會拋出Throwable或子類實例,只有不是屬於Error ,java.lang.RuntimeException 或其子類實例,就必須明確使用 try、 catch 語法加以處理,或者用 Throws 聲明這個方法會拋出異常,否則編譯失敗。
- 異常繼承架構錯誤會被包裝為對象,這些對象都是可拋的。設計錯誤對象都繼承自java.lang.Throwable類。受檢異常,java.lang.Exception及其子類(但非屬於RuntimeException),API客戶端必須明確處理錯誤;非受檢異常:java.lang.Error,編譯程序不強迫API客戶端在語法上進行處理。
- 規則表示式String的matches()方法設定\d,用於檢查字符串中的字符是不是數字,是則返回ture。
- 注意點若父類異常對象在子類異常對象前被catch,那么catch子類異常對象的區塊將永遠不會被執行;注意catch括號中列出的異常不得有繼承關系,否則編譯錯誤(多重捕捉語法)。
- throw 如果是受檢異常,則必須在方法上使用throws聲明;如果是非受檢異常,則可不使用throws聲明。
- 自定義異常類別通常建議繼承自Exception或其子類,如果不是繼承自Error或RuntimeException,那么就會說受檢異常。
- 堆棧追蹤為得知異常發生的根源,以及多重方法調用下異常的堆棧傳播,可以利用異常對象自動收集的堆棧追蹤;直接調用異常對象的printStackTrace();取得個別的堆棧追蹤元素進行處理可使用getStackTrace(),返回 StackTraceElement數組。
- assert程序執行的某個時間或某種情況下,必然處於或不處於何種狀態下,這是鍾斷言;啟動斷言檢查,執行java指令時,指定-enableassertions或-ea自變量。
- finally無論try區塊中有無發生異常,finally區塊一定會被執行。
- java.lang.AutoCloseable只要操作AutoCloseable接口,就可以套用至嘗試關閉資源語法,可以同時關閉兩個以上的資源對象,中間以分號分隔;try括號中越后面撰寫的對象會越早被關閉。
第九章:
- Collection java.util.List
接口中,記錄每個對象的索引順序,並可依照索引取回對象;java.util.Set
接口中,收集的對象不重復,具有集合的行為;java.util.Queue
接口中,收集對象時以隊列方式,收集的對象加入至尾端,取得對象時從前端;java.util.Deque 接口中,對 Queue 的兩端進行加入、移除等操作。 - Set在收集過程中若有相同的對象,則不再重復收集;HashSet的操作概念是,在內存中開設空間,每個空間會有個哈希編碼;Java中許多要判斷對象是否重復時,都會調用hashCode()與equals()方法。
- Queue Queue繼承自Collection,所以也具有Collection的add()、remove()、element()等方法,然而Queue定義了自己的offer()、poll()與peek()等方法,最主要的差別之一在於:add()、remove()、element()等方法操作失敗時會拋出異常,而offer()、poll()與peek()等方法操作失敗時會返回特定值。
- 使用泛型:用“<>”寫明類型,如果沒有指定,則就會回歸為使用Object類型;聲明參考時有指定類型,創建對象時就不用再寫類型了。
- Lambda Request request=()->out.ptinf("",);相對於匿名類語法,省略了接口方法和方法名稱,->左邊是參數列,右邊是方法本體。
- Interable 與 Iteratoriterator()方法:返回java.util.Iterator接口的操作對象,包括了Collection收集的所有對象,利用iterator()的hasNext()看看有無下一對象,用iterator()的next取得下一對象。
- Comparable與ComparatorCollections的Sort()方法在取得a對象與b對象進行比較時,會先將a對象扮演為Comparale,然后調用a.compareTo(b),a對象順序小於b對象返回小於0的值,相等返回0,大於返回大於0的值;java.util.Arrays的Sort()方法,針對對象排序有兩種版本:收集在數組中的數據必須是Comparable,或者可以傳入Comparator指定排序方式;reverseOder()返回的Comparator會是Comparable對象上定義順序的反序,nullsFirst()接受Comparator在其定義順序上加上讓null排在最前面的規則。
- Map根據某個鍵(Key)來取得對應的值(Value),Map也支持泛型;HashMap,建立鍵值,使用put()方法,指定鍵取回對應的值,使用get()方法;TreeMap,如果建立鍵值對應,則鍵的部分會排序,作為鍵的對象必須操作Comparable接口,或者在創建TreeeMap時指定操作Comparator接口的對象;Properties,setProperty()指定字符串類型的鍵值,getProperty()指定字符串類型的鍵,取回字符串類型的值。
- 訪問Map鍵值想取得Map所有的鍵,可以調用Map的KeySet()返回Set對象,取得map中所有的值,可以使用values()返回Collection對象。
教材學習中的問題和解決過程
- 泛型語法的使用:
- 指定類或方法,時語法簡潔,並得到編譯時期檢查。
- Lambda表達式的使用:
Request request=()->out.printf("處理數據%f%n",Math.random());
- 常用Map操作類:
java.util.HashMap
與java.util.TreeMap
。
代碼調試中的問題和解決過程
- 書上代碼出現如圖錯誤,javac通過,Java運行不對,但不知道如何解決。
- 敲書上例子很多細節不是特別懂:
- 嘗試多敲,仔細研讀相關代碼。
代碼托管
上周考試錯題總結
- 填空:使用JDB進行調試時單步執行命令有step和next,我們優先使用(next)。
- 填空:使用JDB進行調試時查看源代碼的命令是(list)。
- 填空 :10&9 的結果是(8)。
- 填空:”Hello”.charAt(1) 的值是(‘e’)。
- 填空:System.out.println( “HELLO”.( toLowerCase() ) ) 會輸出“hello”。
- 填空:”Hello”.substring( 0,2 )的值是“He”。
- CH06判斷:可以用父類聲明對象引用,用子類生成對象,但需要強制類型轉換。(X)
- CH06判斷:父類中有個public void fight(),子類中有個public void fight( Weapon w),這兩個方法的關系是Override.(X)
- CH07 判斷:Java中一個類可以繼承多個類。(X)
- CH07 填空:用enum定義一個Season的類型表示四季(public enum Season{SPRING, SUMMER, AUTUMN,WINTER})。
- H07 填空:面向對象中,設計經驗可以用(設計模式)表達
結對及互評
- 20155210潘瀅昊是我的學習伙伴,本周他敲代碼600+,達到了本周的學習任務,但大多數是按照書上代碼所敲,課后選擇題代碼同樣未敲。
- 與我相比,潘同學學習認真、刻苦,是我學習的一個非常好的搭檔,我認為我要跟着他的腳步學習Java,這樣才能學好。
- 存在的缺點就是大多數代碼是周六、周日所敲,沒有達到每天上傳代碼的要求,我會督促他同時也要求自己每天都進行學習。
評分標准
-
正確使用Markdown語法(加1分):
- 不使用Markdown不加分
- 有語法錯誤的不加分(鏈接打不開,表格不對,列表不正確...)
- 排版混亂的不加分
-
模板中的要素齊全(加1分)
- 缺少“教材學習中的問題和解決過程”的不加分
- 缺少“代碼調試中的問題和解決過程”的不加分
- 代碼托管不能打開的不加分
- 缺少“結對及互評”的不能打開的不加分
- 缺少“上周考試錯題總結”的不能加分
- 缺少“進度條”的不能加分
- 缺少“參考資料”的不能加分
-
教材學習中的問題和解決過程, 一個問題加1分
-
代碼調試中的問題和解決過程, 一個問題加1分
-
本周有效代碼超過300分行的(加2分)
- 一周提交次數少於20次的不加分
-
其他加分:
- 周五前發博客的加1分
- 感想,體會不假大空的加1分
- 排版精美的加一分
- 進度條中記錄學習時間與改進情況的加1分
- 有動手寫新代碼的加1分
- 課后選擇題有驗證的加1分
- 代碼Commit Message規范的加1分
- 錯題學習深入的加1分
-
扣分:
- 有抄襲的扣至0分
- 代碼作弊的扣至0分
點評模板:
-
基於評分標准,我給本博客打分:XX分。得分情況如下:xxx
點評過的同學博客和代碼
其他(感悟、思考等,可選)
本周學習的Java知識難度明顯增大,好多知識都是從未涉及的,這讓我想到了C中的結構體也是很難,而自己也不是很好的理解,相比之下Java的學習更是重要,若這周學習跟不上,那么在以后的學習中勢必會特別困難,所以我會繼續加強本周內容的掌握。
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 20篇 | 200小時 | |
第一周 | 8/10 | 1/4 | 8/10 | 編寫第一個Java程序HelloWorld |
第二周 | 79/89 | 1/5 | 11/21 | 學習Java基礎語法 |
第三周 | 249/338 | 1/6 | 16/37 | 學習Java關於對象的重要知識 |
第四周 | 331/669 | 1/7 | 17/54 | 學習Java關於繼承、接口與多態的重要知識 |
第五周 | 507/1176 | 1/8 | 18/72 | 學習Java的異常處理、Collection與Map |
嘗試一下記錄「計划學習時間」和「實際學習時間」,到期末看看能不能改進自己的計划能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
-
計划學習時間:20小時
-
實際學習時間:18小時
-
改進情況:用了更多的時間學習Java,同時花費時間學習其他的知識。
(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)