第八章html
使用try
、catch
前端
特色:java
try
、catch
語法,JVM
會嘗試執行try
區塊中的程序代碼。若是有錯誤發生,會跳離錯誤發生點,執行catch
區塊中的代碼。catch
區塊後,沒有其餘程序代碼,程序就會結束。注意:git
- 在java中,全部的錯誤都會被打包成爲對象。而try、catch是在發生了InputMismatchException的錯誤。(實際上並不鼓勵,在 異常繼承架構分析。)
異常繼承架構:express
特色:編程
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
拋出。throws
加以聲明;若是認爲調用API
的客戶端沒有準備好就調用了方法,纔會形成還有未處理的錯誤,就自定義非受檢異常、填入適當錯誤信息並從新拋出。注意:ide
- 先處理後拋出的時候是使用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
架構
具備索引的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類型返回。lambda
表達式注意符號->左邊是參數列,右邊是方法本體。(若是是單參數又無須寫出參數的類型時候()能夠省略)注意:
- 書上的例子角括號中的E只是一個類型表明。 - 這類API沒有指定類型參數實際類型,程序代碼中出現類型參數的地方就會迴歸使用Object類型。 - 使用lambda表達式,編譯程序在推斷類型時候,還可使用泛型聲明的類型做爲信息來源。
Interable與Iterator
iterator()
方法,定義在Collection
。該方法會返回java.util.Iterator
接口操做對象,這個對象包括了Collection
收集的全部的對象,可使用Iterator的hasNext()
看看有無下一個對象,如有的話在使用next()
取得下一對象。可以使用forEach()
來收集對象。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
問題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不是很優秀,可是我本身知道我在很努力學,堅持老是會有進步的。
模板中的要素齊全(加1分)
教材學習中的問題和解決過程, 一個問題加1分
代碼調試中的問題和解決過程, 一個問題加1分
本週有效代碼超過300分行的(加2分)
6 其餘加分: - 週五前發博客的加1分 - 感想,體會不假大空的加1分 - 排版精美的加一分 - 進度條中記錄學習時間與改進狀況的加1分 - 有動手寫新代碼的加1分 - 課後選擇題有驗證的加1分 - 代碼Commit Message規範的加1分 - 錯題學習深刻的加1分 7 扣分: - 有抄襲的扣至0分 - 代碼做弊的扣至0分
基於評分標準,我給本博客打分:10。得分狀況以下:
就這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小時
改進狀況: