20155336 2016-2017-2《JAVA程序設計》第五周學習總結
教材學習內容總結
第八章
- 語法與繼承構架
-
使用
try
、catch
-
特點:
- 使用
try
、catch
語法,JVM
會嘗試執行try
區塊中的程序代碼。如果有錯誤發生,會跳離錯誤發生點,執行catch
區塊中的代碼。 - 執行完
catch
區塊后,沒有其他程序代碼,程序就會結束。
- 使用
-
注意:
- 在java中,所有的錯誤都會被打包成為對象。而try、catch是在發生了InputMismatchException的錯誤。(實際上並不鼓勵,在 異常繼承架構分析。)
-
-
異常繼承架構:
-
特點:
- 設計錯誤的對象都繼承自
java.lang.Throwable
類,其有兩個子類java.lang.Error
與java.lang.Exception
。 Error
錯誤:JVM
內部的嚴重問題。無法恢復。程序人員不用處理。Exception
異常:普通的問題。通過合理的處理,程序還可以回到正常執行流程。要求編程人員要進行處理。RuntimeException
:也叫非受檢異常。這類異常是編程人員的邏輯問題。java
編譯器不進行強制要求處理。也就是說,這類異常在程序中,可以進行處理,也可以不處理。- 非
RuntimeException
:也叫受檢異常。這類異常是由一些外部偶然因素所引起的。java
編譯器強制要求處理。也就是說,程序必須進行對這類異常的處理。 - 如果是檢受異常,可由方法的客戶端依據當時調用的環境信息進行處理,必須使
throws
聲明此方法會拋出的異常類或父親類。 - 如果是非受檢異常,原本就可以自行選擇石佛偶處理異常,也不用特別在方法上使用
throws
聲明。 - 如果某個方法聲明會拋出
Throwable
或子類實例,只要不是屬於Error
、java.langRuntimeException
或其子類實例,就必須明確使用try
、catch
語法加以處理,或者用throws
聲明這個方法會拋出異常。
- 設計錯誤的對象都繼承自
-
注意:
- Error與其子類實例代表嚴重的系統錯誤,其對象拋出時,基本不用處理,任其傳播至JVM為止,或者最多留下日志信息。 - 使用try、catch捕捉異常對象時也要注意,如果父類異常對象在子類異常前被捕捉,則catch子類異常對象的區塊永遠不會被執行。 - catch括號中列出的異常不得有繼承關系,否則會發生編譯錯誤。 - java是唯一采用受檢異常的語言,一是為了文件化,客戶端只要查閱文件,就可以知道哪些方法可能發生異常;二是提供編譯程序 信息,讓編譯程序能夠在編譯時期就檢查出API客戶端沒有處理異常。
-
-
關於抓和拋:
-
特點:
- 如果編譯程序會拋出受檢異常,無法使用
try
、catch
處理時,必須使用throws
聲明此方法會拋出的異常類型或父類型,編譯程序才會讓你通過編譯。 - 如果拋出非受檢異常,在
java
中的設計上認為,非受檢異常是程序設計不當引發的漏洞,異常應自動往外傳播。 - 實際上,先可使用
try
、catch
處理完部分錯誤后,可以使用throw
拋出。 - 重新拋出異常時,如果認為調用API的客戶端應當有能力處理未處理的錯誤,就自定義受檢異常、填入適當錯誤信息並重新拋出,並在方法上使用
throws
加以聲明;如果認為調用API
的客戶端沒有准備好就調用了方法,才會造成還有未處理的錯誤,就自定義非受檢異常、填入適當錯誤信息並重新拋出。
- 如果編譯程序會拋出受檢異常,無法使用
-
注意:
- 先處理后拋出的時候是使用throw不是throws。 - 在自定義類別的時候通常建議繼承自Exception或其子類。 - 在流程中要拋出的異常,也要思考一下,關鍵在於這是客戶端可以處理的問題嗎?還是客戶端沒有准備好前置條件就調用方法,才引發的異常?
-
-
認識堆棧追蹤:
- 特點:
- 采用直接調用異常對象的
printStackTrace()
- 善用堆棧追蹤,不可有私吞異常的行為、對異常做了不當的處理。
- 在使用
throw
重拋異常時,異常的追蹤堆棧起點,任然是異常發生的根源。
- 采用直接調用異常對象的
-
注意:
- 如果想要讓異常堆棧成為重拋異常的地方,可以使用fillInStrackTrace()方法,這個方法會重新裝填異常堆棧,將起點設為重 拋異常的地方,並返回Throwable對象。
- 特點:
-
關於assert:
- 是一種斷言,預期結果與實際程序狀態相同,斷言成立,否則斷言不成立。在java中使用-enableassertions或者是-ea自變量在執行時啟動斷言檢查。 - assert有兩種使用方法 1. assert boollean_expression;2. assert boolean_expression:detail_pression。 - checkGreatThanZero()是一種前置條件檢查,如果程序上線之后就不需要這種檢查的話,可以將之assert取代。 - charge()方法中使用了批注來提示方法調用后的對象狀態必不可義為負,不如使用assert取代。
-
異常與資源管理:程序因錯誤而拋出異常時,原本的執行流程就會中端,如果程序開啟了相應得資源,應該在使用完后關閉資源。
- 特點:
- 使用法
finally
,try
、catch
可以搭配finally
區塊使用。且該區塊一定會被執行。 - 可以先檢查
scanner
是否為null
,仔調用close()
方法關閉Scanner
。 - 嘗試關閉語法資源可套用的對象,必須操作
java.lang.AutoClothesable
接口 - 嘗試關閉語法資源可以同時關閉兩個以上的對象資源,只要中間以分號分割。
- 使用法
-
注意:
- 如果撰寫的流程中線先return,而且也有`finally`區塊,那`finally`區塊會先執行后再將值返回。 - 嘗試自動關閉資源的對象,是撰寫在`try`之后的括號中。 - 在try括號中,越后面撰寫的對象的資源會越早關閉。
- 特點:
第九章
- 使用
Collection
收集對象 -
了解
Collection
架構- 在使用滿足各種需求的API前,需要先了解其繼承與接口操作,才能了解何時采用哪個類,以及類間如何彼此合作。
- 可以清楚地明了哪些類操作了哪個接口,繼承了那個類,或哪些接口又繼承自哪個接口。總之可在API文件上查詢。
-
具有索引的List
-
特點:
- 是一種
Collection
,收集對象,並以索引的方式保留收集的對象順序。 java.util.ArrayList
,數組在內存中會是連續的線性空間,根據索引隨機存取時速度較快。LinkedList
在操作List
接口,才用了連接結構。- 在每次
add()
對象時,會建立新的Node
來保存對象,不會事先消耗內存。
- 是一種
-
注意:
ArayList如果需要調整索引順序時,會有較差的表現,使用ArrayList操作此類並不經濟。 如果收集的對象經常會有變動索引的情況,也許考慮鏈接方式操作的List比較合適。
-
-
內容不重復的set
-
特點:
- 在收集過程中若有相同對象,則不在重復收集。
String
的split()
,可以指定切割字符串的方式。- 調用
set
的size()
方法,就可以知道收集的字符串個數。 HashSet
的toString()
操作,會包括收集的字符串。- 會使用對象
hashcode()
與equals()
來判斷對象是否相同。
-
注意:
如果同一個哈希桶已有對象,調用該對象equals()與要加入的對象比較,結果為false則非重復,給予收集true表示兩個是重復對象,不予收集。
-
-
支持隊列操作的Queue
-
如果希望收集對象時以隊列的方式,收集的對象加入至尾端,取得對象是從前端。
-
自己定義了
offer()、poll()、peek()
等。這些方法在操作失敗的時候會返回特定的值。 -
Queue
的子接口Deque
定義了對隊列的前端與尾端進行操作,在前端加入對象與取出對象,在尾端加入或取出對象。 -
addLast()、removeLast()、getLast()
等方法。同樣在其操作失敗時返回特殊值。
-
-
使用泛型和
lambda
表達式-
特點:
- 不知道被收集對象的形態,在內部操作時,都是使用
Object
來參考被收集的對象。取回對象時也是以Object類型返回。 - 泛型語法支持API時可以指定類或方法支持泛型類名稱。
- 在類名稱旁用角括號表示支持此類泛型。
lambda
表達式注意符號->左邊是參數列,右邊是方法本體。(如果是單參數又無須寫出參數的類型時候()可以省略)
- 不知道被收集對象的形態,在內部操作時,都是使用
-
注意:
- 書上的例子角括號中的E只是一個類型代表。 - 這類API沒有指定類型參數實際類型,程序代碼中出現類型參數的地方就會回歸使用Object類型。 - 使用lambda表達式,編譯程序在推斷類型時候,還可以使用泛型聲明的類型作為信息來源。
-
-
Interable與Iterator
iterator()
方法,定義在Collection
。該方法會返回java.util.Iterator
接口操作對象,這個對象包括了Collection
收集的所有的對象,可以使用Iterator的hasNext()
看看有無下一個對象,若有的話在使用next()
取得下一對象。可使用forEach()
來收集對象。- JDK5之后,將
iterator()
方法,提升至新的java.util.Iterable
父接口。實際上還是調用了iterator()
方法,運用返回的Iterator
對象來迭代取得收集的對象。
-
Comparable與Comparator
- 操作
Comarable
Collection
的sort()
方法必須操作java.lang.Comparable
接口,接口有個方法compare()
方法如果a對象順序小於b對象順序返回小於0的值,若順序上相等則返回0,若順序上a大於b則返回大於0的值。set
的操作類之一java.util.TreeSet
不僅擁有收集不重復對象的能力,還可以用紅黑樹方式排序收集的對象,但條件必須是Comparable
。Queue
的操作類之一java.util.PriorityQueue
收集至PriorityQueue
的對象,會根據指定的優先權來決定對象在對列中的順序,優先權的告知,對象必須是Comparable
或者是創建PriorityQueue
時指定Comparator
對象。
- 操作
Comparator
- 接受
java.util.Comparator
接口操作對象,根據caompare()
決定。其會傳入兩個對象,如果o1順序上小於o2則返回小於0的值,順序相等則返回0的值,順序上o1大於o2則返回大於0的值。
- 接受
- 操作
-
鍵值對應的
Map
-
特點:
- 事先利用
java.util.Map
接口的操作對象來建立鍵值對應數據。 - 常用的
Map
操作類為Jjava.util.HashMap與java.util.TreeMap
,其繼承自抽象類java.util.AbstractMap。
HashMap
,要建立鍵值對應,可以使用put()
方法,第一個自變量是鍵,第二個自變量是值。對於Map而言,鍵不會重復,判斷是否重復根據hashCode()與equals()
。TreeMap
,鍵的部分將被排序,條件是作為鍵的對象必須操- 作
Comaprable
接口,或者是在創建TreeMap
時指定Comparator
接口對象。 Properties
的setProperty()
指定字符串類型的鍵值,getProprty
指定字符串類型的鍵,取回字符串類型的值,通常稱為屬性名稱與屬性值。- 可以使用
getProperties()
取得ProPerties
實例。 - 如果想要取得
Map
中所有的鍵,可以調用Map
的KeySet()
返回Set
對象。 - 如果想取得
Map
所有的值,可以使用values()
返回Collection
對象。 - 如果想同時取得
Map
的鍵與值,可以使用entrySet()
方法,這會返回一個Set
對象,每個元素都是Map.Entry
實例,可以調用getKey()
取得鍵,調用getValue()
取得值。
- 事先利用
-
注意
.properties的=左邊設定屬性名稱,右邊設定屬性值。 除了可載入.properties文檔外,也可以使用loadfromXML()方法加載.xml文檔,必須注意文件格式。
-
教材學習中的問題和解決過程
-
問題1:
throw
到底是什么啊?該怎么樣使用? 心好累~~~T - T @-@- throw是拋出一個異常,這個異常可以是系統定義的異常,也可以是自定義的異常(運行時產生的異常是由系統來負責的,throw是由我 們來控制的)。在一個方法體中,如果產生了異常(主動拋出或者運行時產生的異常),那么一般有兩種處理方法。第一種就是try-catch 捕獲異常,並作處理。第二種就是不作任何處理,在方法名后面直接用throws將方法體里面的異常再往上拋出,拋到調用這個方法的地方 再做捕獲處理,或者也可繼續往上拋,這里用的就是throws。這兩種處理到最后都是要捕獲處理的。所以說trow就是顯示的用來拋出一個 異常的,throws是方法將自己方法體內運行產生的異常或顯示拋出而未處理的異常再往外拋時用的,它可以是多個。
-
問題2: 各種異常之間存在怎樣的關系?
Error
(嚴重系統錯誤) 受檢異常(客戶端有能力處理):Exception
非受檢異常(未在恰當時機調用方法):RuntimeException
上周考試總結
- 填空:使用JDB進行調試時單步執行命令有step和next,我們優先使用(next)
- "hello"。substring(0,2)的值是"He"。
- 判斷:final可以用在類,方法,變量前。(OK)
- 面向對象中,設計經驗可以用(設計模式)表達
代碼調試中的問題和解決過程
-
問題1:
package cc.openhome; import java.util.*; class Student{ private String name; private String number; Student (String name , String number){ this.name = name; this.number = number; } @Override public String toString(){ return String.format("(%s,%s)", name,number); } } public class Students { public static void main(String[] args){ Set students = new HashSet(); students.add(new Student("Justin","B835031")); students.add(new Student("Monica","B835032")); students.add(new Student("Justin","B835031")); System.out.println(set);//這里 } }
根據書上,這個代碼最后一行代碼為System.out.println(set);但是卻編譯不通過顯示錯誤。跟同學討論后,將
set
改為student
之后,編譯就通過了! -
問題2:
import java.util.HashMap; import java.util.Map; import static java.lang.System.out; public class MapKeyValue { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map.put("one", "一"); map.put("two", "二"); map.put("three", "三"); out.println("顯示鍵"); map.keySet().forEach(key -> out.println(key)); out.println("顯示值"); map.values().forEach(key -> out.println(key)); } }
為什么書上顯示的是二一三,而我是一二三?
其他(感悟、思考等,可選)
本次學習過程中,遇到的問題比較多,而且很復雜。一是時間很緊,二是一周兩章確實真的很要命啊,這周內容這么難更沒法完全掌握了。只能
先跟着老師的思路跑了跑程序,詳細的等以后再理解。每個人都會有所差別,對於編程的領悟也不同,以至於每個人的學習程度,優良中差也不
同。但是我也在盡我最大的努力去學,現在的電子水平越來越高。類似於博客這種電子化的作業也會有很多方面來源的復制,不能僅僅憑借博客
的好壞來判斷自己的學習好壞,但是雖然我覺得我自己雖然學習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分
點評模板:
-
基於評分標准,我給本博客打分:10。得分情況如下:
- 正確使用Markdown語法
- 模板中的要素齊全
- 教材學習中的問題和解決過程, 一個問題加1分,一共倆
- 代碼調試中的問題和解決過程, 一個問題加1分,一共倆
- 本周有效代碼超過300分行的(加2分)
- 感想,體會不假大空的加1分
- 有動手寫新代碼的加1分
- 代碼Commit Message規范的加1分
- 課后選擇題有驗證的加1分
就這10分根本不夠加的~~~
點評過的同學博客和代碼
學習進度條
| 代碼行數(新增/累積)| 博客量(新增/累積)|學習時間(新增/累積)|重要成長|
-------- | :----------------:|:----------------:|:---------------: |:-----:|
| 目標 | 5000行 | 30篇 | 400小時 | |
| 第一周 | 200/200 | 2/2 | 20/20 | |
| 第二周 | 300/500 | 2/4 | 18/38 | |
| 第三周 | 500/1000 | 3/7 | 22/60 | |
| 第四周 | 800/1300 | 4/9 | 30/90 | |
| 第五周 | 1800/2000 | 5/9 | 45/100 | |
-
計划學習時間:21小時
-
實際學習時間:15小時
-
改進情況: