20155318 2016-2017-2 《Java程序設計》第五周學習總結
教材學習內容總結
try...catch
- 鍵盤輸入利用java.util.Scanner,Scanner 名 new Scanner(System.in);…int number=名.nextInt();將用戶輸入的下一個字符剖析為int型。
- Java中所有錯誤都會被打包為對象,這些對象都可拋出,都繼承自java.lang.Throwable類,該類又分為
java.lang.Error和java.lang.Exception(異常處理)兩個子類 - try{…}catch (…){…}先嘗試try區塊中的代碼,如果錯誤就和catch括號中的錯誤類型做比較,相同時執行catch區塊的代碼。
異常繼承架構
- catch異常后的區塊內容重復了,可以使用多重捕捉語法如下:
try{
...
}catch(IOEeception | InterruptedException | ClassCastException e)
{
e.printStackTrace();
}
- catch括號中列出的異常不得有繼承關系,否則會發生編譯錯誤。如果父類異常對象在子類異常對象前被捕捉,則catch子類異常對象的區塊永遠不會被執行。
FileInputStream可以指定檔名來開啟與讀取文檔內容,但是在創建時會FileNotFoundException錯誤。拋出受檢異常表示客戶端有能力且應處理異常,必須在方法上使用throws聲明。- 無論try區塊中有無異常發生,若撰寫有finally區塊,則finally區塊一定會被執行。
關閉資源
- try with resources
- java.lang.AutoCloseable
collection、List、Set、Queue
- List是一種Collection,作用是收集對象,並以索引方式保留收集的對象順序,包括:
- ArrayList特性:用數組搜索對象,速度快,適合排序
- LinkedList特性:鏈接結構,利於調整索引順序
- Set:判斷對象是否重復時會調用hashCode()和equals()方法,且必須同時操作
- Queue:Queue繼承自Collection,Queue定義了自己的offer()、poll()與peek()等方法,操作失敗時會返回特定值
- iterator()方法定義在Collection接口中,會返回
java.util.Iterator接口的操作對象,這個對象包括了Collection收集的所有對象;增強式for循環還可以運用在操作Iterable接口的對象上。 - Map操作類為java.util.HashMap與java.util.TreeMap
教材學習中的問題和解決過程
- 問題1:try區塊中有異常發生時,若撰寫有finally區塊是否會被執行,如果程序中包含return,final區塊會怎么執行?
- 解決方案:如果流程中先return了,那么finally區塊會先執行完后,在將值返回。代碼及程序運行結果如下:
public class FinallyDemo{
public static void main(String[] args){
System.out.println(test(true));
}
static int test(boolean flag){
try{
if(flag){
return 1;
}
}finally{
System.out.println("finally...");
}
return 0;
}
}

- 問題2:Lambda表達式:
- 解決方案:Lambda表達式:
Request request=()->out.printf("處理數據 %f",Math.random());Lambda表達式的語法省略了接口類型和方法名稱。—>左邊是參數列,右邊是方法本體。編譯程序可以由Request request的聲明中得知語法上被省略的信息。
import java.util.*;
interface Request2
{
void execute();
}
public class RequestQueue2
{
public static void main (String[] args)
{
Queue<Request2>requests = new LinkedList<>();
offerRequestTo(requests);
process(requests);
}
static void offerRequestTo(Queue<Request2>requests)
{
for (int i = 1; i < 6;i++)
{
requests.offer
(() -> System.out.printf("處理數據%f%n",Math.random()));
}
}
static void process(Queue<Request2>requests)
{
while(requests.peek() != null)
{
Request2 request = requests.poll();
request.execute();
}
}
}
- 問題3:受檢異常
- 解決方案:需要注意如果父類異常對象在子類異常對象前被捕捉,則catch子類異常對象的區塊永遠不會被執行。總結為:子類不能比父類拋出更大的異常。這個問題通過看了狄惟佳同學的博客得以解決。
- 子類覆蓋父類方法是,父類方法拋出異常:子類的覆蓋方法可以不拋出異常,或者拋出父類方法的異常。2. 父類方法拋出了多個異常,子類覆蓋方法時,只能拋出父類異常的子集。3. 父類沒有拋出異常,則子類不可拋出異常。若子類發生非運行時異常,需要進行try-catch處理,不能拋出。4. 子類不能比父類拋出更大的異常。
代碼調試中的問題和解決過程
- 問題1:用Idea時之前的代碼編譯未通過,導致后來的代碼也不能運行。
- 解決方案:除了刪除之前的錯誤代碼還沒有找到合適的解決方法。
- 問題2:finally塊中的代碼一定會被執行嗎?
- 解決方案:參考話說finally塊中的代碼一定會執行嗎?這篇博客,首先測試finally的代碼是否會執行。
public class TestFinally {
public static void main(String[] args) {
try{
System.out.printf("nomal");
}catch (Exception ex){
System.out.printf("Exception");
}finally {
System.out.printf("Finally");
}
}
}
執行結果:

在try或是catch塊中使用了return語句,將代碼稍作修改:
public static void main(String[] args) {
try{
System.out.printf("nomal");
}catch (Exception ex){
System.out.printf("Exception");
return;
}finally {
System.out.printf("Finally");
}
}
執行結果:finally中的代碼還是執行了

再次簡單修改代碼:
public static void main(String[] args) {
try{
System.out.printf("nomal");
System.exit(0);
}catch (Exception ex){
System.out.printf("Exception");
System.exit(0);
}finally {
System.out.printf("Finally");
}
}
運行代碼,結果為:System.exit()終止了JVM,finally不執行。

- 結論:finally不一定都會執行,在不終止JVM的情況下,finally中的代碼一定會執行。
- 問題3:書上p269Students按照書上在IDEA中輸入后顯示有錯誤
Cannot resolve symbol 'set' - 解決方案:書上印刷有錯誤,將最后一句中的set改為students即可運行成功。
代碼托管
- 代碼提交及代碼量截圖:


上周考試錯題總結
-
錯題1::被聲明為protected的方法,只能中繼承后的子類中訪問。(X)
-
解決:參考這個圖可知除被本類或者派生類(子類)的成員函數訪問外,還可以被本包內所有類訪問

-
錯題2:父類的protected方法,在子類中可以override為public的方法。(OK)
-
解決:方法的重寫必須滿足以下要求(從方法的五要素來分析):
- 要有繼承;
- 方法名,參數列表要相同;
- 訪問修飾符不能比父類窄;
- 也就是說,父類的public方法在重寫時,訪問修飾符必須是public,因為public的范圍最大,否則就不構成方法的重寫,例如:對於父類protected的方法,在重寫時可以用protected或public來修飾。搜索
- 拋出的異常不能比父類更寬泛;
- 返回類型要比父類的小或相同。
- 錯題3:Math中的abs()方法可以Override.(X)
- 未解決
- 錯題4:XX是一個引用型變量,System.out.println(XX)等價於System.out.println(XX.toString()). (OK)
- 錯題5:實現一個類中的equals()方法時,一定要同時實現(hashCode())方法
- 解決方案
- 錯題6:面向對象中,設計經驗可以用(設計模式)表達
結對及互評
點評模板:
- 基於評分標准,我給本博客打分:9分。得分情況如下:
- 正確使用Markdown語法,+1
- 模板中的要素齊全,+1
- 教材學習中的問題和解決過程, +3
- 代碼調試中的問題和解決過程, +3
- 本周有效代碼超過300分行的+2
- 其他加分
- 進度條中記錄學習時間與改進情況的+1
- 有動手寫新代碼+1
點評過的同學博客和代碼
其他感悟
本周因為准備二級的原因,代碼敲得有些少,從周日才開始學習Java,下周還是會利用平時的時間學習。慢慢找到了平時測試的套路,但是動手實踐還是很少,獨自編寫一個新學的程序還是有一定困難。
學習進度條
| 代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
|---|---|---|---|---|
| 目標 | 5000行 | 30篇 | 400小時 | |
| 第一周 | 50/100 | 1/1 | 24/24 | 安裝學習Java的一系列軟件 |
| 第二周 | 250/300 | 1/2 | 30/54 | 了解Java的基本語法 |
| 第三周 | 552/852 | 1/3 | 16/60 | 了解Java是面向對象的語言 |
| 第四周 | 717/1569 | 1/4 | 10/70 | 了解Java繼承與接口 |
| 第五周 | 495/2064 | 1/5 | 6/76 | 了解異常處理,學會使用Collection收集對象 |
嘗試一下記錄「計划學習時間」和「實際學習時間」,到期末看看能不能改進自己的計划能力。這個工作學習中很重要,也很有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
-
計划學習時間:10小時
-
實際學習時間:6小時
