20155318 2016-2017-2 《Java程序設計》第五週學習總結

20155318 2016-2017-2 《Java程序設計》第五週學習總結

教材學習內容總結

try...catch

  1. 鍵盤輸入利用java.util.Scanner,Scanner 名 new Scanner(System.in);…int number=名.nextInt();將用戶輸入的下一個字符剖析爲int型。
  2. Java中全部錯誤都會被打包爲對象,這些對象均可拋出,都繼承自java.lang.Throwable類,該類又分爲java.lang.Errorjava.lang.Exception(異常處理)兩個子類
  3. try{…}catch (…){…}先嚐試try區塊中的代碼,若是錯誤就和catch括號中的錯誤類型作比較,相同時執行catch區塊的代碼。

異常繼承架構

  1. catch異常後的區塊內容重複了,可使用多重捕捉語法以下:
try{
    ...
}catch(IOEeception | InterruptedException | ClassCastException e)
{
    e.printStackTrace();
}
  1. catch括號中列出的異常不得有繼承關係,不然會發生編譯錯誤。若是父類異常對象在子類異常對象前被捕捉,則catch子類異常對象的區塊永遠不會被執行。
  2. FileInputStream能夠指定檔名來開啓與讀取文檔內容,可是在建立時會FileNotFoundException錯誤。拋出受檢異常表示客戶端有能力且應處理異常,必須在方法上使用throws聲明。
  3. 不管try區塊中有無異常發生,若撰寫有finally區塊,則finally區塊必定會被執行。

關閉資源

  1. try with resources
  2. java.lang.AutoCloseable

collection、List、Set、Queue

  1. List是一種Collection,做用是收集對象,並以索引方式保留收集的對象順序,包括:
    • ArrayList特性:用數組搜索對象,速度快,適合排序
    • LinkedList特性:連接結構,利於調整索引順序
  2. Set:判斷對象是否重複時會調用hashCode()和equals()方法,且必須同時操做
  3. Queue:Queue繼承自Collection,Queue定義了本身的offer()、poll()與peek()等方法,操做失敗時會返回特定值
  4. iterator()方法定義在Collection接口中,會返回java.util.Iterator接口的操做對象,這個對象包括了Collection收集的全部對象;加強式for循環還能夠運用在操做Iterable接口的對象上。
  5. 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子類異常對象的區塊永遠不會被執行。總結爲:子類不能比父類拋出更大的異常。這個問題經過看了狄唯佳同窗的博客得以解決。html

    1. 子類覆蓋父類方法是,父類方法拋出異常:子類的覆蓋方法能夠不拋出異常,或者拋出父類方法的異常。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");
        }
    }
}

執行結果:
java

在try或是catch塊中使用了return語句,將代碼稍做修改:git

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)
  • 解決:參考這個圖可知除被本類或者派生類(子類)的成員函數訪問外,還能夠被本包內全部類訪問
    dom

  • 錯題2:父類的protected方法,在子類中能夠override爲public的方法。(OK)
  • 解決:方法的重寫必須知足如下要求(從方法的五要素來分析):
  1. 要有繼承;
  2. 方法名,參數列表要相同;
  3. 訪問修飾符不能比父類窄
  • 也就是說,父類的public方法在重寫時,訪問修飾符必須是public,由於public的範圍最大,不然就不構成方法的重寫,例如:對於父類protected的方法,在重寫時能夠用protected或public來修飾。搜索
  1. 拋出的異常不能比父類更寬泛;
  2. 返回類型要比父類的小或相同。
  • 錯題3:Math中的abs()方法能夠Override.(X)
  • 未解決
  • 錯題4:XX是一個引用型變量,System.out.println(XX)等價於System.out.println(XX.toString()). (OK)
  • 錯題5:實現一個類中的equals()方法時,必定要同時實現(hashCode())方法
  • 解決方案
  • 錯題6:面向對象中,設計經驗能夠用(設計模式)表達

結對及互評

點評模板:

  • 基於評分標準,我給本博客打分:9分。得分狀況以下:
  1. 正確使用Markdown語法,+1
  2. 模板中的要素齊全,+1
  3. 教材學習中的問題和解決過程, +3
  4. 代碼調試中的問題和解決過程, +3
  5. 本週有效代碼超過300分行的+2
  6. 其餘加分
    • 進度條中記錄學習時間與改進狀況的+1
    • 有動手寫新代碼+1

點評過的同窗博客和代碼

其餘感悟

本週由於準備二級的緣由,代碼敲得有些少,從週日纔開始學習Java,下週仍是會利用平時的時間學習。慢慢找到了平時測試的套路,可是動手實踐仍是不多,獨自編寫一個新學的程序仍是有必定困難。ide

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 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就接近了。函數

參考:軟件工程軟件的估計爲何這麼難軟件工程 估計方法學習

參考資料

相關文章
相關標籤/搜索