20172308《程序設計與數據結構》第九周學習總結

20172308 2017-2018-2 《Java程序設計》第九周學習總結

教材學習內容總結

1.第十一章 異常

1.什麼是異常:非正常狀況或錯誤的對象,由程序或運行時環境拋出,可根據須要進行捕獲處理
2.錯誤:相似異常,但不可恢復且必須捕獲處理
3.try-catch:用於捕獲可能出現的異常語句塊;try可關聯多個catch,catch爲異常處理器,用於匹配可能的異常
4.finally子句:保證必定執行某段代碼(能夠不寫)
5.爲何要捕獲異常:沒有捕獲的異常會使程序非正常停止,捕獲異常但是程序跳過可能異常語句,繼續運行程序
6.異常傳遞:此級沒有捕獲異常,會返回向上一級的調用方法,直到被捕獲。
7.自定義異常:從Exception類或其後代類中派生的,選擇一個做爲父類,新異常由所表明的問題和條件決定
8.I/O異常:html

2.第十二章 遞歸

1.自我理解:一種不是循環的循環
2.應用:迷宮,漢諾塔問題java

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

  • 問題1:書上的重點概念「異常拋出時所輸出的信息,提供了方法調用堆棧蹤影」,然而我並不知道什麼是堆棧蹤影。。。git

  • 問題1解決過程:居然百度不到概念。。。綜合理解一下,大概是異常拋出時,IDEA提示錯誤的那幾行紅字:指明異常發生在何處算法

【參考資料】:
辛勤的代碼工
既然選擇了遠方 便只顧風雨兼程編程

  • 問題2:無心中看到一個問題:「是否能夠在一個catch代碼塊裏捕獲多個異常」,答案是能夠的,那若是是這樣,還寫那麼多句catch幹嗎,都寫一個裏面不就行了?數組

  • 問題2解決過程:嗯,這是Java自己的升級,在Java7裏,catch代碼塊獲得了升級,用以在單個catch塊中處理多個異常。若是你要捕獲多個異常而且它們包含類似的代碼,使用這一特性將會減小代碼重複度函數

【參考資料】:
JAVA 7新特性-在單個catch代碼塊中捕獲多個異常
風同樣的碼農學習

  • 問題3:由於在寫習題PP12.1的時候,用遞歸出了一點問題(已經記錄在博客裏面),結合書上的自測題,瞭解一下「何時應避免使用遞歸」以及「遞歸與循環的比較」.net

  • 問題3解決過程:
    1.遞歸與循環是兩種不一樣的解決問題的典型思路。
    2.遞歸算法:
    優勢:代碼簡潔、清晰,而且容易驗證正確性。
    缺點:它的運行須要較屢次數的函數調用,若是調用層數比較深,須要增長額外的堆棧處理,好比參數傳遞須要壓棧等操做,會對執行效率有必定影響。
    3.循環算法:
    優勢:速度快,結構簡單。
    缺點:並不能解決全部的問題。
    4.當使用迭代法更簡單時,避免使用遞歸,以免屢次調用方法的開銷設計

【參考資料】:
ggxxkkll的專欄
遞歸這東西是否是儘可能避免使用?
百度知道
什麼時候使用遞歸

代碼調試中的問題和解決過程

  • 問題1:PP11.1。我老是以爲書上的問題表述不是很清楚:好比,「在程序的main方法中讀取輸入的字符串,直到輸入「DONE」爲止。若是輸入的字符串多於20個字符,則拋出異常」。總以爲不是很理解意思:是要輸入一長串的字符串,讀到DONE就中止讀入,而後計算字符串是否超過20個嗎?仍是要屢次輸入字符串,直到輸入DONE爲止,而後累計輸入的字符個數是否多餘20個;

  • 問題1解決過程:
    綜合以上想法,大概是要屢次輸入,判斷每一次輸入的字符串是否超過20個。
    1.代碼調試過程當中發現的第一個問題:在用到字符串判斷是否相等的時候,只能用方法. equals才能判斷,用「 == 或者 != 」則不行。
    2.題目只要求判斷每次輸入的字符串是否超過20個,並未要求存儲字符串,而我多此一舉地加了上去,反而致使不能輸入任意次了(由於數組須要提早申請內存),現已改正。
    3.結合PP11.2,要求的是捕獲異常,並輸出一條適當信息並繼續處理後面的字符串,代碼如圖:

    我輸出的結果是:當輸入的字符串字符數超過20個時,會輸出一條信息,包含異常的字符串,並繼續輸入直到DONE。
    這裏遇到的問題是寫好了上圖中的try-catch語句以後,老是會標紅說try語句裏的異常不存在,一頭霧水,反覆對照書上的代碼,並未發現錯誤。後來操做了幾個地方,可是無關痛癢,又嘗試運行了一次,居然成功了。最後得出的結論是IDEA沒有及時去掉標紅吧。

  • 問題2:PP12.1。按道理來講,這道題應該很簡單,我寫的代碼應該是對的,代碼如圖:

    如圖,我輸入了「wew」,這是一個迴文,但運行出現了問題,提示是遞歸的方法有問題

  • 問題2解決方案:首先要解釋一下代碼。個人遞歸方法,用了兩個參數n,m。n爲0,表明字符串的索引值爲0處的字符;m爲最後一位的字符索引值。這樣在遞歸方法裏只要比較一下n和m處的字符是否相等就OK了,而後將n+1,m-1,繼續比較,層層遞歸,直到不同的地方輸出不是迴文,不然的話到n>m的時候直接輸出是迴文即達到判斷要求。
    而後這裏有一個問題是:遞歸的方法裏須要提早定義字符串,才能繼續比較。可是這個字符串是要用戶輸入的,而若是在遞歸方法裏寫用戶交互的方法的話,會致使每一次調用遞歸方法的時候都要再輸一次字符串。如圖:

    可是遞歸方法與main方法裏的字符串仍是不能互通,雖然把遞歸方法寫成一個類,而後再繼承它應該能夠解決,可是我不大想這樣作,總以爲很麻煩。
    後來,在main方法外面聲明瞭一個str變量,在main和遞歸方法裏都能調用,如圖:

    這樣算是解決了問題。
    還有就是那個getstr的方法,並無用到,我一開始覺得還要在遞歸方法裏get一下才能獲得那個輸入的字符串,現已刪掉。

代碼託管

上週考試錯題總結

  • 錯題1:

  • 錯題1解析:沒有關聯捕獲語句的try語句中沒有代碼,即引用某個未知的類,使用一個參數,或者處理新內存的生成,將拋出NullPointerException

  • 錯題2:

  • 錯題2解析:這兩個異常都是RuntimeException的子元素,它自己就是異常的子元素,書上有寫到,是我看的不夠仔細

  • 錯題3:

  • 錯題3解析:書上原話:「Java中惟一的不可檢測異常是RuntimeException類的對象或該類的後代類對象。」運行時異常不被檢查異常。

  • 錯題4:

  • 錯題4解析:若是一個異常的發生處沒有捕獲和處理該異常,控制將當即返回到產生該異常的方法的上一級調用方法,若是仍未捕獲將繼續向上一級傳遞,直到異常被捕獲。

  • 錯題5:

  • 錯題5解析:這題是蒙的,真的不會。照着機翻的理解一下:掃描器類經過擁有本身的catch (IOException…)catch語句,致使一個IOException的掃描器類中的任何代碼都被掃描器類捕獲,這樣可能使用掃描器類的類就沒必要處理這個被檢查的異常。

  • 錯題6:

  • 錯題6解析:這個書上真沒有,百度到的東西一大堆,並無過多的涉及到本題選項所說的東西:PrintWriter類是一個Writer類,而PrintStream類是一個流類。主要的區別是PrintWriter是專門爲文件而設計的,所以有錯誤檢查機制,而不是PrintStream的一部分。

  • 錯題7:

  • 錯題7解析:我明明記得曾經在哪裏看到過try語句能夠不用catch的,可是如今找不到了。。。當時我還覺得這題絕對會對的

結對及互評

  • 博客中值得學習的或問題:
    • 侯澤洋同窗的博客排版工整,界面很美觀
    • 問題總結作得很全面
    • 對於書上的疑惑總會想辦法解決它,這種探索的精神值得我去學習
  • 代碼中值得學習的或問題:
    • 對於編程的編寫總能找到角度去解決
  • 本週結對學習狀況
    • 20172302
    • 結對學習內容
      • 第十一章內容:異常
      • 第十二章內容:遞歸

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 309/309 1/1 20/20
第二週 269/578 1/2 18/38
第三週 236/776 1/3 22/60
第四周 507/1283 2/5 30/90
第五週 631/1914 1/6 30/120
第六週 529/2443 1/7 25/145
第七週 515/2958 1/8 25/170
第八週 1128/4086 2/10 50/220
第八週 1241/5327 1/11 15/235

參考資料

相關文章
相關標籤/搜索