1. 程式人生 > >20172327 2017-2018-2 《程序設計與數據結構》第十周學習總結

20172327 2017-2018-2 《程序設計與數據結構》第十周學習總結

重要 出錯 索引 語句 mea 異常處理 不一定 自己 更改

學號 2017-2018-2 《程序設計與數據結構》第十周學習總結

教材學習內容總結

第11章 異常

- 異常處理:


1.錯誤和異常都是對象,代表非正常情況或無效處理。

2.常見的異常問題:

- 試圖做除以0的操作。
- 數組索引越界。
- 找不到指定的文件。
- 不能正常完成被請求的I/O操作。
- 使用了空引用。
- 執行的操作違反了某種安全規則。


3.處理異常的三種方法

- 根本不處理異常。
- 當異常發生時處理異常。
- 在程序的某個位置集中處理異常。
- 未捕獲的異常:


1.異常拋出時所輸出的信息,提供了方法調用堆棧蹤跡。

2.如果程序中不處理異常,則程序將非正常的終止運行,並產生關於描述在何處發生什麽異常的信息。第一行異常信息表明拋出的是什麽異常,並提供了拋出該異常的原因。其他行的信息是方法調用蹤跡信息,指明異常在何處發生。通過調用被拋出異常類的方法,也可以獲得調用堆棧蹤跡。getMessage方法返回一個字符串,解釋異常拋出的原因;printStackTrace方法輸出調用堆棧蹤跡信息。

- try-catch語句:


1.ry-catch語句用來標誌可能拋出異常的語句塊,catch子句跟在try語句塊後,用於定義如何處理一種指定的異常。


2.try { 語句塊 } catch(類型名 標識符) { 語句塊 }

3.執行try語句塊時,如果沒有異常拋出,將繼續執行try-catch結構語句後的語句,這是正常情況執行流程。

4.如果try語句塊執行的任何位置拋出了異常,並且存在catch子句,則控制立即轉移到相應的catch子句處理異常,即控制轉移到第一個與拋出異常相匹配的catch子句執行,執行完之後,跳出try-catch語句結構繼續執行。

- finally子句:

1.有點像switch語句中的default語句,無論怎麽樣,這個語句一定會執行。如果有finally子句,那一定要排在catch子句後,除非沒有catch子句。無論try語句塊正常退出或由於拋出異常而退出,都將執行finally子句,因此可以利用finally子句管理資源或保證一定執行某段代碼。
- 異常的傳遞:

1.如果在上級調用方法中仍然沒有捕獲和處理下級傳上來的異常,則控制將返回到上級調用方法的更上一級調用方法,這個過程叫做傳遞異常。異常將一直傳遞下去,直到被捕獲和處理,或直到異常傳遞出main方法,這時將終止程序的運行並產生錯誤信息。

2.如果在一個異常的發生處沒有處理和捕獲異常,控制將立即返回產生該異常的方法的上一級調用方法,因此可以將程序設計為在上級調用方法(外層調用)中捕獲和處理異常。

- 異常類參次結構:


1.定義各種的類由繼承關系關聯在一起。
Throwable是Error類和Exception類的父類。許多異常的類型都是由Exception
類派生,而在這些類中也有許多子類。
雖然這些高層的類定義在java.lang包裏,但定義各種異常的子類卻分散定義在其他幾個包中,繼承關系可以跨包越界。

2.【自定義異常】:我們可以從Exception類或它的後代類派生一個新類,定義自己的異常,選擇什麽類作為父類由新異常所代表的問題和條件決定。

3.【可檢測異常和不可檢測異常】:Java中唯一不能檢測的異常是RuntimeException類的對象或該類的後代類服務對象。所有其他的異常都是可檢測異常。
可檢測異常:必須由方法捕獲,或者必須在可能拋出或傳遞異常方法的throws子句中列出來。
在方法定義的聲明頭中加throws子句就明確了該方法在異常發生時將拋出異常或者傳遞異常。main方法之所以需要throws子句,是因為它所拋出的異常類由由Exception類派生,從而使得它的子類是一個可檢測異常。
不可檢測異常:無需throws子句。

- I/O(輸入/輸出)異常:


1.標準I/O流有三種:

2.| 標準I/O流 | 說明 |
| -------- | :----------------:|
|System.in |標準輸入流|
|System.out |標準輸出流|
|System.err |標準錯誤流(輸出錯誤信息)|

第12章 遞歸

- 遞歸思想:


1.遞歸是一種方法能夠調用自己的編程技術,掌握遞歸編程的關鍵是能以遞歸的思想考慮問題。

- 無窮遞歸和有窮遞歸:


1.只有遞歸定義部分就變成了無窮遞歸,所以在任何遞歸定義中必須要有成為基本情況的非遞歸定義部分,才能使遞歸最終結束。
- 遞歸編程:

1.每一次對方法的遞歸調用,都會創建新的局部變量與參數。

2.每次遞歸都需要新增內存空間,因此無窮遞歸常產生運行時錯誤,報告內存耗盡的錯誤信息。
- 直接遞歸和間接遞歸:

1.方法調用自己的遞歸,稱為直接遞歸;如果一個方法調用其他方法,最終導致再次調用自己,則稱為間接遞歸。
- 遞歸應用:

1.迷宮問題和漢諾塔問題。

教材學習中的問題和解決過程

  • 問題1:遞歸與叠代的關系與區別?
  • 問題1解決方案:


1: 使用遞歸要註意的有兩點:

1)遞歸就是在過程或函數裏面調用自身;
2)在使用遞歸時,必須有一個明確的遞歸結束條件,稱為遞歸出口.


2:遞歸分為兩個階段:

1)遞推:把復雜的問題的求解推到比原問題簡單一些的問題的求解;

2)回歸:當獲得最簡單的情況後,逐步返回,依次得到復雜的解.


叠代:利用變量的原值推算出變量的一個新值.如果遞歸是自己調用自己的話,叠代就是A不停的調用B.

遞歸中一定有叠代,但是叠代中不一定有遞歸,大部分可以相互轉換.能用叠代的不用遞歸,遞歸調用函數,浪費空間,並且遞歸太深容易造成堆棧的溢出.

  • 問題2:字節流和字符流到底是什麽?為什麽在I/O異常這節提到了?定義在java.io包中的那麽多方法都怎麽系統的理解?
  • 問題2解決方案:
區別

實際上字節流在操作時本身不會用到緩沖區(內存),是文件本身直接操作的,而字符流在操作時使用了緩沖區,通過緩沖區再操作文件![](https://images2018.cnblogs.com/blog/1333119/201805/1333119-20180517191455594-1618495632.jpg)
程序運行後會發現文件中沒有任何內容,這是因為字符流操作時使用了緩沖區,而 在關閉字符流時會強制性地將緩沖區中的內容進行輸出,但是如果程序沒有關閉,則緩沖區中的內容是無法輸出的,所以得出結論:字符流使用了緩沖區,而字節流沒有使用緩沖區。

在java.io包中操作文件內容的主要有兩大類:字節流、字符流,兩類都分為輸入和輸出操作。在字節流中輸出數據主要是使用OutputStream完成,輸入使的是InputStream,在字符流中輸出主要是使用Writer類完成,輸入流主要使用Reader類完成。(這四個都是抽象類)。

上周考試錯題總結

  • 第一題:Which of the following is not true of the RuntimeExceptions class?
    A .All RuntimeExceptions throw checked exceptions
    B .All RuntimeExceptions are Throwable objects
    C .RuntimeException has child classes ArithmeticException and NullPointerException
    D .RuntimeException objects are not Error objects
    E .All of the above are true
  • 分析:運行時異常是可拋出的對象,並不是錯誤類的一部分,而兩種類型的runtimeexception是算術異常和NullPointerException。不屬於運行時異常的異常包括各種檢查異常,但運行時異常不被檢查異常。
  • 第二題:The term "exception propagation" means
    A .an exception is caught by the first catch clause
    B .an exception not caught by the first catch clause is caught by an outer (enclosing) catch clause
    C .exceptions are caught, sequentially, by catch clauses in the current try block
    D .exceptions always are caught by the outermost try block
    E .none of the above
  • 分析:異常傳播意味著一個異常被匹配的catch子句在當前try塊級別,如果沒有匹配,然後在下一個封閉try塊級別,等等,直到異常已經被匹配的條款或異常的主程序和被Java虛擬機。

  • 第三題:In order to define a keyboard input object, keyboard, you could use the instruction:
    BufferedReader keyboard = new BufferedReader(System.in);
    A .true
    B .false
  • 分析:一個BufferedReader對象必須用Reader對象構建。系統。in是一個輸入流對象。為了使用上述定義,必須將BufferedReader構造函數中的對象更改為(新的InputStreamReader(System.in))。一份法律聲明。

代碼托管

點評過的同學博客和代碼

  • 本周結對學習情況
    • [20172317]
    • 20172320

    • 結對學習內容
    • 教材第11,12章
    • 閱讀11.1-11.6、12.1-12.3章節
    • 完成課後自測題,並參考答案學習
    • 完成課後練習題
    • 完成程序設計項目:至少完成PP11.1、PP11.2、PP12.1、PP12.9

其他(感悟、思考等,可選)

概念很多,嘚仔細看,有很多細節,和前面的章節聯系緊密。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一周 95/95 1/1 18/18
第二周 515/620 1/2 22/40
第三周 290/910 1/3 20/60
第四周 1741/2651 1/4 30/84
第五周 579/3230 1/5 20/104
第六周 599/3829 2/8 18/122
第七周 732/4561 2/9 24/146
第八周 1354/5915 2/11 30/176
第九周 不知為啥,代碼無緣無故少了300行,我現在很迷

參考:軟件工程軟件的估計為什麽這麽難,軟件工程 估計方法

  • 計劃學習時間:30小時

  • 實際學習時間:30小時

  • 改進情況:無

(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表)

參考資料

  • 《Java程序設計與數據結構教程(第二版)》

  • 《Java程序設計與數據結構教程(第二版)》學習指導

20172327 2017-2018-2 《程序設計與數據結構》第十周學習總結