20155303 2016-2017-2 《Java程序設計》第五周學習總結
教材學習中的問題和解決過程
- 『問題一』:受檢異常與非受檢異常
『問題一解決』:
受檢異常:這種在編譯時被強制檢查的異常稱為"受檢異常"。即在方法的聲明中聲明的異常。
非受檢異常(運行時異常)在方法的聲明中沒有聲明,但在方法的運行過程中發生的各種異常被稱為"不被檢查的異常"。這種異常是錯誤,會被自動捕獲。
RuntimeException
和它的子類以及Error
和它的子類都是非受檢異常。因此,對於一個方法拋出RuntimeException
和它的子類或者Error
和它的子類。調用它無需進行異常處理,編譯器能通過。除此之外的其它異常類都需要進行異常處理,即添加try-catch(-finally)
語句塊進行捕捉和處理。
- 『問題二』:
throw
與throws
『問題二解決』:throw
出現在函數體中,用來拋出一個異常。程序會在throw
語句后立即終止,它后面的語句執行不到,然后在包含它的所有try
塊中(可能在上層調用函數中)從里向外尋找含有與其匹配的catch
子句的try
塊。而throws
出現在一個函數頭中,用來標明該成員函數可能拋出的各種異常。具體用法如下:
throw語法:throw <異常對象>
throws語法:[<修飾符>]<返回值類型><方法名>([<參數列表>])[throws<異常類>]
注意:throws
表示出現異常的一種可能性,並不一定會發生這些異常;throw
則是拋出了異常,執行throw
則一定拋出了某種異常。
- 『問題三』:
Error
與Exception
『問題三解決』:查詢API文檔可以得知Error
與Exception
之間的關系:
Error
類一般是指與虛擬機相關的問題,如系統崩潰,虛擬機錯誤,內存空間不足,方法調用棧溢等。對於這類錯誤的導致的應用程序中斷,僅靠程序本身無法恢復和和預防,遇到這樣的錯誤,建議讓程序終止。Exception
類表示程序可以處理的異常,可以捕獲且可能恢復。遇到這類異常,應該盡可能處理異常,使程序恢復運行,而不應該隨意終止異常。
Exception
類又分為運行時異常(Runtime Exception)和受檢查的異常(Checked Exception ),運行時異常;ArithmaticException,IllegalArgumentException,編譯能通過,但是一運行就終止了,程序不會處理運行時異常,出現這類異常,程序會終止。而受檢查的異常,要么用try...catch
捕獲,要么用throws字句聲明拋出,交給它的父類處理,否則編譯不會通過。
- 『問題四』:
read()
方法探究
如果使用read()
方法時沒有重寫,則編譯失敗:
『問題四解決』:InputStream
被定義為一個抽象類,相應的,該類下的read()
方法也是一個抽象方法,這也就意味着必須有一個類繼承InputStream
並且實現這個read
方法。查閱Java8 API,我們可以看到,在InputStream
中定義了三個重載的read()
方法:
但是在這三個方法中,只有參數列表為空的read()
方法定義為抽象方法,這也就意味着在直接繼承自InputStream
的所有子類中,必須重寫這個方法。
- 『問題五』:
compare()
與compareTo()
在使用方法上的不同
『問題五解決』:查詢API文檔可了解兩者的差異:
compareTo(Object o)
方法是java.lang.Comparable
compare(Object o1,Object o2)
方法是java.util.Comparator
代碼調試中的問題和解決過程
- 『問題一』:
catch()
異常的繼承關系
在catch括號中列出的異常不得有繼承關系,否則會發生編譯錯誤:
『問題一解決』:多重捕捉時要注意異常繼承架構。
- 『問題二』:
try-catch-finally
的執行關系
『問題二解決』:以下面的程序為例:
try {
statement;
}
catch(TheException ex) {
handling ex;
}
finally {
finalStatement;
}
在任何情況下,finally塊中的代碼都會被執行,不管try
塊中是否出現了異常或是否捕獲異常。考慮以下幾種情況:
-
若
try
塊中沒有出現異常,finalStatement
被執行,try
語句的下一條語句被執行。 -
若
try
塊中有一個語句引起異常,並被catch
捕獲,就會跳過try塊中的其他語句,執行catch和finally子句。若catch塊沒有重新拋出異常,就會執行try語句之后的下一個語句。如果重新拋出異常,就將這個異常傳遞給這個方法的調用者。 -
若
try
塊中有一個語句引起異常,但沒有被任何catch塊捕獲,就會跳過try塊中的其他語句,執行finally塊,並將異常傳遞給這個方法的調用者。 -
注意:即使在到達finally塊之前有一個return語句,finally塊還是會執行。
-
『問題三』:如何理解課本P247提到的“assert不應當作程序執行流程的一部分”?
這里有一個錯誤示例:
這個程序中,對personName的賦值被轉移到assert
語句中,盡管斷言有效時它可以很好地運行(即使用-ea運行
時可以有效地運行)但如果斷言失效,則它會運行時報空指針錯誤。因為斷言無效時,
personName=personObj.getName()
一句永遠不會執行。
『問題三解決』:修改后的正確代碼如下:
注意:理解斷言最重要的一點是必須不依賴它們完成任何程序實際所需的行為。因為正常發布的代碼都是斷言無效的,即正常發布的代碼中斷言語句都不不執行的(或不起作用的)。
- 『問題四』:
hashCode()
與equals()
的區別(編程驗證)
『問題四解決』:(1)覆蓋hashcode后的Student類::
結果分析:我們沒有覆蓋equals方法只覆蓋了hashCode方法,兩個對象雖然hashCode一樣,但在將stu1和stu2放入set集合時由於equals方法比較的兩個對象是false,所以就沒有在比較兩個對象的hashcode值。
(2)覆蓋equals方法和hashCode方法:
結果分析:stu1和stu2通過equals方法比較相等,而且返回的hashCode值一樣,所以放入set集合中時只放入了一個對象。
- 『問題五』:非運行時異常(受檢異常)的注意事項(編程驗證)
『問題五解決』:(1)子類覆蓋父類方法是,父類方法拋出異常,子類的覆蓋方法可以不拋出異常,或者拋出父類方法的異常:
(2)子類覆蓋父類方法,不能比父類拋出更大的異常:
總結:1:子類覆蓋父類方法是,父類方法拋出異常:子類的覆蓋方法可以不拋出異常,或者拋出父類方法的異常。
2:父類方法拋出了多個異常,子類覆蓋方法時,只能拋出父類異常的子集。
3:父類沒有拋出異常,則子類不可拋出異常。若子類發生非運行時異常,需要進行try-catch
處理,不能拋出。
4:子類不能比父類拋出更大的異常。
代碼托管
代碼提交及代碼量截圖:
上周考試錯題總結
- System.out.println( “HELLO”.( toLowerCase() ) ) 會輸出“hello”
『考點』:查詢API文檔可知toLowerCase()的使用方法:將此字符串中的所有字符轉換為小寫
- 填空:使用JDB進行調試時單步執行命令有step和next,我們優先使用(next)
『考點』:next
:把函數執行完成;step
:跳進函數內部。
- CH06填空:寫出編譯P165 RPG.java的命令(javac –d . *.java)
『考點』:P165 RPG.java是一個測試函數,需要把工作類及測試類的程序全部編譯。"."表示在當前文件夾下編譯。
- Math中的abs()方法可以Override.
『考點』:abs()方法的返回值是絕對值,不能進行重寫。
- CH07 填空:用enum定義一個Season的類型表示四季(public enum Season{SPRING, SUMMER, AUTUMN,WINTER})。
『考點』:enum中列舉的常數一般用大寫字母表示。
- CH07 填空:面向對象中,設計經驗可以用(設計模式)表達。
結對及互評
基於評分標准,我給本博客打分:9分。具體如下:
- 正確使用Markdown語法:+1
- 模板中的要素基本齊全:+1
- 教材學習中的問題和解決過程:+3
- 代碼調試中的問題和解決過程:+2
- 進度條中記錄學習時間與改進情況:+1
- 感想,體會不假大空:+1
點評:可以看出來,馬超同學對課本上的內容進行了思考,提出了不少很有價值的問題,這點要向馬超學習。模板使用也比較標准。希望以后遇到問題多動手敲代碼~繼續努力!!!
點評過的同學博客
學習感悟及思考
這一周學習狀態不佳,由於周六要參加計算機等級考試,所以前幾天將大部分的時間用在刷題上,稍微放松了學校課程的學習。但這周的學習任務並不輕松,所以在接下來的這一周,我需要彌補這周缺失的學習時間,夯實基礎,不然很可能阻礙之后的學習。
學習進度條
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一周 | 16/16 | 1/1 | 18/18 | 初步認識了Java |
第二周 | 219/235 | 1/2 | 28/46 | 學習了Java的基本語法知識 |
第三周 | 766/1001 | 1/3 | 23/69 | 了解對象與參考的關系,以及封裝的概念與實現 |
第四周 | 984/1985 | 1/4 | 18/87 | 學習了繼承與多態的關系,以及接口的多態操作 |
第五周 | 866/2851 | 1/5 | 12/99 | 學習了異常處理,學會使用Collection收集對象 |
嘗試一下記錄「計划學習時間」和「實際學習時間」,到期末看看能不能改進自己的計划能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
參考:軟件工程軟件的估計為什么這么難,
-
計划學習時間:25小時
-
實際學習時間:12小時
-
改進情況:學習時間不足,以后應該多投入一些時間,加強練習。
(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)