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

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

教材學習內容總結

第十一章 異常

1.異常

  • 異常處理
    • 異常處理的經常使用方法有三種:
      • 根本不處理
      • 當異常發生時處理異常
      • 在程序的某個位置集中處理異常
    • 處理異常的主要方法是捕獲異常
  • 異常捕獲——try-catch語句
    • 格式:
    try{語句塊}
    catch(異常名稱 exception){處理異常的語句}
    finally{語句塊}
    • try語句以後必須有一條或多條catch子句,但能夠沒有finally子句,在finally子句存在使,不管try語句塊執行時是否發生異常,finally子句都將執行。
  • 異常的傳遞
    • 例:假設一個程序執行時,它要調用一個類的Method1方法,但Method1方法要調用Method2方法,但Method2方法中發生了異常,若是沒有處理這個異常的話,它就會傳遞到Method1中,使Method1方法也產生異常。
    • 在遇到傳遞的異常時,要仔細考慮實際狀況,尋找合適的地方來處理異常。
  • 異常類層次結構
    • 見圖:
  • 自定義異常
    • throw:拋出異常
    • throws:用於方法名的後面,作一個聲明,表示下面可能會有這個異常,可是具體仍是要用throw來拋出異常。
    • 在自定義異常中throws和throw必須是成對出現的,除非用try-each語句解決,可是已經定義好的異常是不用的。
  • I/O異常
    • I/O類執行時產生的異常成爲IOEexception異常
    • 標準輸入/輸出/錯誤流
標準I/O流 名稱 說明
System.in 標準輸入流 從鍵盤輸入信息
System.out 標準輸出流 在顯示器上顯示信息
System.err 標準錯誤流 在顯示器上輸出錯誤信息

2.文件讀寫(雖然此部分不是書上內容,可是是老師上課講的重點內容)

  • 文件建立(使用File類)
    • 格式
    File file = new File(文件保存路徑 文件名稱)
    if (!file.exists())
    {file.createNewFile(); }
    • 主要方法截圖:
  • 文件夾建立(使用File類)
    • mkdir:只能建立一個新文件夾。
    • mkdirs:能夠建立一個新文件夾的同時在這個文件夾下再建立一個新的文件夾。
  • 文件讀寫
    • 字節操做流(使用FileOutputStream和FileInputStream類)
      • 格式:
      //文件寫入
      OutputStream outputStream = new FileOutputStream(file);
      byte[] hello = {'H','e','l','l','o',',','W','o','r','l','d','!'};
      outputStream.write(hello);
      • 主要方法截圖:
      //文件讀取
      InputStream inputStream = new FileInputStream(file);
      while (inputStream.available()> 0){
          System.out.print((char) inputStream.read()+"  ");
      }
      inputStream.close();
      • 主要方法截圖:
    • 字節緩衝流(使用BufferedOutputStream和BufferedInputStream類)
      • 格式:
      //文件讀取
      byte[] buffer = new byte[1024];
      String content = "";
      int flag = 0;
      InputStream inputStream = new FileInputStream(file);
      BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
      while ((flag = bufferedInputStream.read(buffer))!=-1){
          content += new String(buffer,0,flag);
      }
      bufferedInputStream.close();
      • 主要方法截圖:
      //文件寫入
      OutputStream outputStream = new FileOutputStream(file);
      BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
      String content1 = "寫入文件的緩衝區內容";
      bufferedOutputStream.write(content1.getBytes(),0,content.getBytes().length);
      bufferedOutputStream.flush();
      bufferedOutputStream.close();
      • 主要方法截圖:
    • 字符操做流(使用FileWriter類和FileReader類)
      • 格式:
      //文件讀取
      Writer writer = new FileWriter(file);
      writer.write("Hello, World!");
      writer.flush();
      writer.append("Hello,Java"); // 在文件中續寫
      writer.flush();
      • 主要方法截圖:
      //文件寫入
      Reader reader = new FileReader(file);
      System.out.println();
      char[] temp = new char[100];
      reader.read(temp);
      • 主要方法截圖:
    • 字符緩衝流(使用BufferedOutputStream類和BufferedInputStream類)
      • 格式:
      //文件讀取
      BufferedWriter bufferedWriter = new BufferedWriter(writer);
      String content = "使用bufferedWriter寫入";
      bufferedWriter.write(cont.length());
      bufferedWriter.flush();
      bufferedWriter.close();
      • 主要方法截圖:
      //文件寫入
      BufferedReader bufferedReader = new BufferedReader(reader2);
      while ((content =bufferedReader.readLine())!= null){
          System.out.println(content);}
      • 主要方法截圖:

第十二章 遞歸

  • 遞歸是一種容許一個方法調用本身以達到最終目的的技術。
    • 例:
    //計算n的階乘
    factorial(n){
        if(n==1)
        return 1;
        else
        return factorial(n-1)*n;
    }
  • 遞歸的種類
    • 無窮遞歸:只有遞歸定義的部分而沒有非遞歸定義部分的遞歸
    • 直接遞歸:方法調用本身的遞歸
    • 簡介遞歸:一個方法調用其餘方法,最終再調用本身的遞歸。
  • 遞歸的應用

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

  • 問題1:爲何書上的全部例題中,爲何在catch的括號內的類型名後有個exception?它是固定的嗎?
  • 問題1解決方案:書上說這個東西叫作標識符,但苦逼的是我仍是沒想起來標識符是什麼,翻書終於在第一章的1.4.3找到了它,但書上沒有寫清楚標識符到底是幹什麼的因此我有點懵,去查了一下恍然大悟:標識符是用來給類、對象、方法、變量、接口和自定義數據類型命名的。因此說類型名後的exception只是一個經常使用的命名方法,它能夠換成其餘任何合法的其餘標識符。
  • 那麼再來複習一下標識符的命名規範吧:
    • (1) 標識符由字母、數字、下劃線「_」、美圓符號「$」或者人民幣符號「¥」組成,而且首字母不能是數字。
    • (2) 不能把關鍵字和保留字做爲標識符。
    • (3) 標識符沒有長度限制。
    • (4) 標識符對大小寫敏感。

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

  • 問題1:作PP11.1的時候不知道爲何不能用break
  • 問題1解決方案:這是一個概念沒搞清楚的問題。一開始我用使用Alt+Enter找不到解決方法,後來查了一下break的用法想起來它必須用在循環裏面,一樣的continue也是。
  • 問題2:作PP12.1時,產生了字符串越界錯誤
  • 問題2解決方案:使用單步調試和try-each語句捕獲異常都沒有解決問題,詢問告終對的張昊然同窗他說個人這段代碼沒有非遞歸定義部分,因此成爲了一個無限遞歸。新代碼的邏輯是:首先判斷字符串長度是否等於1,等於1則必定爲迴文;而後判斷長度是否等於2,等於2時判斷對應字符是否相等,這裏就定義了非遞歸部分;最後若是字符串長度大於2的話,使用遞歸依次判斷對應字符是否相等。
  • 問題3:文件讀寫中如何分行?
  • 問題3解決方案:使用writer.write(10)來分行,但不知道爲何若是把文件放到IDEA裏就能夠分行,可是放到計算機裏就不能夠了。因此上網上查了一下java中文件讀寫如何實現分行,發現大部分的回答都建議並使用了BufferedReader流的形式。找到了一個過程比較詳細的代碼例子:
public class TestC {
    public static void main(String[] args){
    //獲取要讀取的文件
            File readFile=new File("D://home/a.txt");
            //輸入IO流聲明
            InputStream in=null;
            InputStreamReader ir=null;
            BufferedReader br=null;
            
        try {
                    //用流讀取文件
                    in=new BufferedInputStream(new FileInputStream(readFile));
            //若是你文件已utf-8編碼的就按這個編碼來讀取,否則又中文會讀取到亂碼
            ir=new InputStreamReader(in,"utf-8");
            //字符輸入流中讀取文本,這樣能夠一行一行讀取
            br=new BufferedReader(ir);
            String line="";
            //一行一行讀取
            while((line=br.readLine())!=null){
            System.out.println(line);
            }       
            } catch (Exception e) {
            e.printStackTrace();
        } finally{
            //必定要關閉流,倒序關閉
                }
        try {       
        if(br!=null){
            br.close();
        }
        else if(ir!=null){
            ir.close();
        }
        else if(in!=null){
            in.close();
        }
        } catch (Exception e2) {
        }
        }   
    }
}

代碼託管

上週考試錯題總結(正確爲綠色,錯誤爲紅色)

  • 錯題1:An interface name can be used to declare an object reference variable.
    • A . true
    • B . false
  • 緣由及理解狀況:用於聲明引用的既能夠是類名也能夠是接口名。

結對及互評

點評模板

  • 博客中值得學習的或問題:
    • 優勢:增長了目錄
    • 問題:老問題又犯了,感受從博客內容看不出有過多的深刻思考
  • 代碼中值得學習的或問題:
    • 優勢:註釋一針見血,看的時候能清楚的明白代碼的做用是什麼
    • 問題:PP12.9沒有使用數組

點評過的同窗博客和代碼

  • 本週結對學習狀況
    • 20172322
    • 結對學習內容
      • 在張昊然同窗作IO測試作得快要癲狂的時候給他提供了思路,講解了一下文件讀寫的相關內容。
      • 張昊然同窗在這周的教材學習中給我提供了大量幫助,由於把大部分精力花在文件讀寫上了因此這一塊學的有點不紮實,以後會再次複習的。

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

  • 本週最難的部分我以爲是文件讀寫這部分,雖然感受上課聽懂了,可是老師留的實踐做業花了整整一天才實現,可是又被學長否認了說實踐的不合理因此又推到重來了一遍,可是沒想到從新改的一遍只用了一夜時間。因此說,前期漫長難熬的艱苦歲月是必要的,由於它在爲你以後能走的捷徑鋪路。
  • 教材複習狀況
    • 複習進度(頁數):101/310
    • 重要成長:
      • 複習了String類、Random類、NumberFormat類、DecimalFormat類的相關內容。
    • 感想:這周最大的收穫就是把那些經常使用類都標記下來了,這樣之後就不用來回翻書了。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 120/120 1/1 9/9
第二週 246/366 1/2 9/18
第三週 785/1121 2/4 15/33
第四周 615/1736 1/5 20/53
第五週 1409/2645 1/6 24/77
第六週 561/3206 1/7 20/97 再次搞清了一些本身有點含糊不清的概念
第七週 63/3269 1/8 15/112
第八週 2476/5745 3/11 90/201
第九周 824/6595 1/12 20/221
  • 計劃學習時間:15小時
  • 實際學習時間:20小時
  • 改進狀況:相比而言可能在異常那一章用的時間更多,尤爲是IO異常那一部分。

參考資料

相關文章
相關標籤/搜索