20155321 2016-2017-2 《Java程序設計》第五周學習總結
教材學習內容總結
第八章 異常處理
- Java提供特有的語句進行處理
try
{
需要被檢測的代碼;
}
catch(異常類 變量)
{
處理異常的代碼;(處理方法)
}
finally
{
一定會執行的語句
}
- 對捕獲到的異常對象進行常見方法操作
1)String getMessage() 顯示異常信息
2)toString() 顯示異常名稱:異常信息
3) printStackTrace()(無返回值,無需給println)顯示異常名稱:異常信息:異常出現位置,而JVM默認的異常處理機制就是在調用printStackTrace()方法打印異常的堆棧跟蹤信息
-
throws Exception:在功能上通過throws的關鍵字聲明了該功能有可能會出現問題
-
2種處理方式:捕捉,拋出
-
多異常的處理
-
聲明異常時,聲明更為具體的異常,這樣處理得可以更具體
-
對方聲明幾個異常,就對應有幾個catch塊,不要定義多余的catch塊,且異常間不能有繼承關系
-
在進行catch處理時,catch中一定要定義具體處理方式。不要簡單定義一句printStackTrace(),不方便后期的處理
- 自定義異常
-
產生原因:因為項目中會出現特有的問題,而這些問題並未被Java所描述並封裝對象。所以對於這些特有的問題可以按照Java的對問題封裝的思想,將特有的問題進行自定義的異常封裝
-
自定義異常:定義類繼承Exception或者RuntimeException
1)為了讓該自定義類具備可拋性
2) 為了讓該類具備操作異常的共性方法
-
手動通過throw拋出一個自定義對象
-
當在函數內部出現了throw拋出異常對象,那么就必須要給對應的處理動作。要么在函數上聲明讓調用者處理。一般情況下,函數內出現異常,函數上需要聲明。
-
定義異常信息的方法:因為父類中已經把異常信息的操作都完成了,所以子類只要在構造時,將異常信息傳遞給父類通過super語句,那么就可以直接通過getMessage方法獲取自定義信息
-
throws和throw的區別:throws使用在函數上,throw使用在函數內;throws后面跟的異常類,可以跟多個,用逗號隔開,throw后面跟的是異常對象
-
特殊子類異常:runtimeexcetption運行時異常,即RuntimeException及其子類 在函數內拋出該異常,函數上不用聲明,編譯一樣通過,如果在函數上聲明了該異常,調用者可以不用進行處理(try或拋),編譯一樣通過
注意:之所以不用在函數上聲明,是因為不需要讓調用者處理。當該異常發生,希望程序停止,因為在運行時,出現了無法繼續運算的情況,希望停止程序后,對代碼進行修正。自定義異常時,如果該異常的發生,無法在繼續進行運算,就讓自定義異常繼承RuntimeException
- 對於異常分兩種
1)編譯時被檢測的異常
2)編譯時不被檢測的異常(運行時異常,RuntimeException以及其子類)
-
finally代碼塊
定義一定執行的代碼,通常用於關閉資源
-
catch是用於處理異常,如果沒有catch就代表異常沒有被處理過,如果該異常是檢測時異常,那么必須聲明
-
異常在子父類覆蓋中的體現
1) 子類在覆蓋父類時,如果父類的方法拋出異常,那么子類的覆蓋方法只能拋出父類的異常或者該異常的子類,或者不拋出
2) 如果父類方法拋出多個異常,那么子類在覆蓋該方法時,只能拋出父類異常的子集
3) 如果父類或者接口的方法中沒有異常拋出,那么子類在覆蓋方法時,也不可以拋出異常。如果子類方法發生了異常,就必須要進行try處理,絕對不能拋
第九章 集合與泛型
-
集合類的特點:集合只用於存儲對象,集合長度是可變的,集合可以存儲不同類型的對象
-
出現這么多的集合容器的原因:因為每一個容器對數據的存儲方式都有不同,這個存儲方式稱之為數據結構
-
集合中存儲的不是對象實體,都是(引用)地址
-
Collection
-
List:元素是有序的,元素可以重復,因為該集合體系有索引
1)特有方法:凡是可以操作角標的方法都是該體系特有的方法
2.1)增 add(index,element);
addAll(index,Collection);2.2)刪 remove(index);
2.3)改 set(index,element);
2.4)查 get(index);
subList(from,to);
listIterator();3)List集合特有的迭代器:ListIterator是Iterator的子接口
在迭代時,不可以通過集合對象的方法操作集合中的元素,因為會發生並發集合異常ConcurrentModificationException。所以,在迭代時,只能用迭代器的方法操作元素,可是Iterator方法是有限的,只能對元素進行判斷,取出,刪除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator
4)該接口只能通過List集合的listIterator方法獲取
5)ArrayList:底層的數據結構使用的是數組結構。特點:查詢速度很快,但是增刪稍慢。線程不同步,效率就高
6)LinkedList:底層使用的是鏈表數據結構。特點:增刪速度很快,查詢速度稍慢
特有方法:
6.1)addFirst(),addLast()
6.2)getFirst(),getLast():獲取元素,但不刪除元素
6.3)removeFirst(),removeLast():獲取元素,並刪除元素。如果集合沒有元素,會出現NoSuchElementException
-
Vector:底層是數組數據結構。功能與ArrayList一樣。線程同步,效率低,因此被ArrayList替代了
枚舉是Vector特有的取出方式,但其實枚舉和迭代時一樣的,因為枚舉的名稱及方法名稱都過程,因此被迭代器取代了。
- 堆棧:先進后出(杯子);隊列:先進先出(水管)
-
Set:元素是無序(存入和取出的順序不一定一致),元素不可以重復
1)Set集合的功能和Collection是一致的
2)HashSet:底層數據結構是哈希表,線程是非同步的
3)HashSet保證元素唯一性的方法:通過元素的兩個方法,hashCode和equals來完成。如果元素的HashCode值相同,才會判斷equals是否為true,如果元素的hashcode值不同,不會調用equals
注意:對於判斷元素是否存在以及刪除等操作,依賴的方法是元素的hashcode和equals方法
4)TreeSet:可以對Set集合中的元素進行排序,底層數據結構是二叉樹,保證元素唯一性的依據是compareTo方法return0
5)TreeSet排序的第一種方式:讓元素自身具備比較性,元素需要實現comparable接口,覆蓋compareTo方法,這種方式也稱為元素的自然順序,或者叫做默認順序
6)TreeSet的第二種排序方式:當元素自身不具備比較性時,或者具備的比較性不是所需要的,這時就需要讓集合自身具備比較性。
-
比較器:將比較器對象作為參數傳遞給TreeSet集合的構造函數
1)當默認排序和比較器排序都存在時,以比較器為主
2)定義一個比較器:定義一個類,實現Comparator接口,覆蓋compare方法(在集合初始化時,就有了比較方式)
-
泛型:JDK1.5版本后出現的新特性,用於解決安全問題,是一個安全機制
1)好處是既能將運行時期出現的問題ClassCastException轉移到了編譯時期,方便於程序員解決問題,讓運行時期問題減少,安全,又能避免使用強制轉換
2)泛型格式:通過<>來定義要操作的引用數據類型,在使用Java提供的對象時,設么時候寫泛型呢?
3)通常在集合框架中很常見,只要見到<>就要定義泛型。其實<>就是用來接收類型的,當使用集合時,將集合中要存儲的數據類型作為參數傳遞到<>中即可
4)什么時候定義泛型類?
當類中要操作的引用數據類型不確定的時候,早起定義Object來完成擴展,現在定義泛型來完成擴展
5)泛型類定義的泛型在整個類中有效,如果被方法使用,那么泛型類的對象明確要操作的具體類型后,所有要操作的類型就已經固定了。為了讓不同方法可以操作不同類型,而且類型還不確定,那么可以將泛型定義在方法上
6)特殊之處:靜態方法不可以訪問類上定義的泛型,如果靜態方法操作的引用數據類型不確定,可以將泛型定義在方法上
教材學習中的問題和解決過程
-
問題1:為什么set會出現問題?
-
解決方案:因為在整個程序內根本沒有出現set變量,應該是students才對
-
問題2:課本P270代碼為什么主函數會有出錯提示?
-
解決方案:估計是書本的大括號打錯了,上面的Student2類結束的時候少了一個大括號
代碼調試中的問題和解決過程
- 問題:課本代碼中編譯出現了錯誤
- 解決方案:暫時還並不知道為什么
代碼托管
上周考試錯題總結
-
錯題1:填空:使用JDB進行調試時單步執行命令有step和next,我們優先使用(next)
-
錯題2:填空:使用JDB進行調試時查看源代碼的命令是(list)
-
錯題3:填空:面向對象中,設計經驗可以用(設計模式)表達
-
錯題4:判斷:Math中的abs()方法可以Override.(X)
原因:靜態方法屬於類,是不能被重寫,故而也不能實現多態
理解情況:從API中得知,Math中的abs()方法是靜態方法,因此不能被重寫
-
錯題5:判斷:被聲明為protected的方法,只能中繼承后的子類中訪問。(X)
原因:對於protected修飾符,該關鍵字所修飾的屬性和方法在不同包的子類中可見,這是指子類繼承了父類中使用protected修飾的屬性和方法,而不是指能夠使用該父類的對象來訪問父類中特定訪問修飾符修飾的屬性或方法。即使在不同包的子類中定義了父類的對象,訪問該父類對象的protected修飾的屬性和方法是不能的
理解情況:
-
錯題6:填空:寫出編譯P165 RPG.java的命令(javac –d . *.java)
原因:沒寫*號
結對及互評
搭檔的學習非常認真,值得我好好學習
評分標准(滿分10分)
-
從0分加到10分為止
-
正確使用Markdown語法(加1分):
- 不使用Markdown不加分
- 有語法錯誤的不加分(鏈接打不開,表格不對,列表不正確...)
- 排版混亂的不加分
-
模板中的要素齊全(加1分)
- 缺少“教材學習中的問題和解決過程”的不加分
- 缺少“代碼調試中的問題和解決過程”的不加分
- 代碼托管不能打開的不加分
- 缺少“結對及互評”的不能打開的不加分
- 缺少“上周考試錯題總結”的不能加分
- 缺少“進度條”的不能加分
- 缺少“參考資料”的不能加分
-
教材學習中的問題和解決過程, 一個問題加1分
-
代碼調試中的問題和解決過程, 一個問題加1分
-
本周有效代碼超過300分行的(加2分)
- 一周提交次數少於20次的不加分
6 其他加分:
- 周五前發博客的加1分
- 感想,體會不假大空的加1分
- 排版精美的加一分
- 進度條中記錄學習時間與改進情況的加1分
- 有動手寫新代碼的加1分
- 課后選擇題有驗證的加1分
- 代碼Commit Message規范的加1分
- 錯題學習深入的加1分
7 扣分:
- 有抄襲的扣至0分
- 代碼作弊的扣至0分
點評模板:
-
基於評分標准,我給本博客打分:9。得分情況如下:
點評過的同學博客和代碼
其他(感悟、思考等,可選)
本周的學習任務總體而言還是比較重的,學習的內容和深度感覺比以往幾個星期都加重了不少。在本周的學習中,我覺得學會查找API給了我較大的幫助,特別是在學習異常和集合框架的時候,主動查API文件可以獲取一些課本上沒提到的信息進而能掃除學習上的一些障礙,除此之外,對於書本上有錯誤的代碼也要進行主動地排錯
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一周 | 1/ | 20/20 | 對IDEA、git、JDK、JVM有了更多的了解,面對學習過程中遇到的困難學會自己主動地尋找辦法去解決 | |
第二周 | 1/2 | 18/38 | 掌握了Java中的基本運算符和基本語句 | |
第三周 | 1/3 | 22/60 | 對面向對象、封裝、構造函數等重要知識點有了初步理解,學會自主學習,遇到困難的時候從多方面尋找資料以求答案 | |
第四周 | 1/4 | 22/60 | 對繼承和多態了一定程度的理解,並學會使用多態來提高代碼的復用性 | |
第五周 | 706/2639 | 1/5 | 25/85 | 對異常以及集合框架的學習 |
嘗試一下記錄「計划學習時間」和「實際學習時間」,到期末看看能不能改進自己的計划能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
-
計划學習時間:20小時
-
實際學習時間:25小時
-
改進情況:看書的效率應該更高,理解力有待提升