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

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

教材學習內容總結

第十一章:異常

  • 一、一些引發異常拋出的問題:
  • (1)試圖作除以0的操做;
  • (2)數組索引越界;
  • (3)找不到指定的文件;
  • (4)不能正常完成被請求的I/O操做;
  • (5)使用了空引用;
  • (6)執行的操做違反了某種安全規則。
  • 二、try-cash語句
  • (1)執行try語句時,將執行try語句塊中的語句。若是沒有異常拋出,將繼續執行try語句後的語句(全部catch子句後的語句);
  • 三、finally語句
  • (1)一條try-catch語句能夠有一個可選的finally子句,用於定義一段不管是否有異常發生的都會執行的代碼;
  • (2)try語句塊能夠沒有catch子句。沒有catch語句時,若是須要仍然可使用finally子句;
  • 四、自定義異常
  • (1)可由Exception類或它的後代類派生一個新類來定義一個新的異常;
  • 五、可檢測異常與不可檢測異常
  • 對於可檢測異常,若是發生異常的方法不捕獲和處理這個異常,則必須在該方法定義的聲明頭中包含throws子句;php

  • 六、I/O異常
  • (1)流是一個有序的字節序列,它能夠用作輸入源或做爲輸出目標;
  • (2)System.out.in:標準輸入流;
  • System.out.out:標準輸出流;
  • System.out.err:標準錯誤流(輸出錯誤信息);html

第十二章:遞歸

  • 一、遞歸思想:遞歸是一種方法可以調用本身的編程技術,掌握遞歸編程的關鍵是能以遞歸的思想考慮問題;
  • (1)無窮遞歸:任何一個遞歸定義中必須有稱爲基本狀況的非遞歸定義部分,才能使遞歸最終結束;
  • (2)數學中的遞歸運算:數學函數和數學公式常以遞歸的形式表示;
  • 二、遞歸編程
  • (1)每一次對方法的遞歸調用,都會建立新的局部變量與參數;
  • (2)對於某些問題,遞歸是最精煉和適當的方法,但對於其餘的問題,遞歸則不如迭代解法直觀;
  • 三、遞歸的應用
  • (1)迷宮旅行;
  • (2)漢諾塔問題;

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

第十一章:

  • 問題1:
    假如錯誤和異常都是對象的話,它是否能夠調用方法或者它在哪兒聲明呢?
  • 問題1解決方案:
    (1)首先先用做業裏的一道題舉個例子,假如咱們先創建一個異常類,而且用一個test測試類來聲明一個異常對象,
    好比:
public class test {
    public static void main(String[] args) {
        StringTooLongException a = new StringTooLongException("");
        System.out.println(a);
    }
}

在這裏就能夠看見不少異常的方法,因此就能夠說明是一個對象,包含一個對象所具備一些性質;java

(2)由於咱們是到其實類都是object類的子類,因此在書裏有這樣一句話:git

Java預約義了一組程序執行中可能發生的異常和錯誤;web

因此咱們應當明白,其實也就能夠理解爲它是一個對象所擁有的一個性質。編程

  • 問題2:錯誤和異常屬於對象,那所拋出的問題屬於一個程序中的哪一部份?
  • 問題2解決方案:既然是程序裏的一部分,因此我在想,假如程序運行,他會被拋出,會不會是程序就是輸出的一部分,或者就是一部分語句塊,想了不少中狀況,由於在後面講的捕捉異常,我感受它應該是是一個輸出的結果,或者就是一個檢測程序錯誤的部分。數組

  • 問題3:一直都在講錯誤和異常,他倆的區別是什麼呢?
  • 問題3解決方案:
    書裏是這樣解釋的:緩存

一個異常是一個定義非正常狀況或錯誤的對象;安全

錯誤相似異常,不一樣之處是錯誤表明不可恢復的問題而且必須捕獲處理。數據結構

感受這個概念書裏講的挺模糊的,就上網查了查:

  • 問題4:在捕獲問題的時候如何具體到語句?這個問題的提出是由於看到了例11.2,裏面的輸出語句後面都帶有一個「+code」,因此,像這樣的須要咱們輸進去語句,檢查咱們輸進去語句是否存在異常,想要知道那句錯了是簡單的,可是假如當咱們編了一個程序,忽然冒出來一堆錯誤,在哪裏也不知道怎麼辦?這道題假如用idea的時候,其實找錯誤只須要點一下拋出異常的後面那個顯示藍色的線,其實就能夠知道哪裏錯了,可是學了這一章之後,假如我要捕捉這個錯誤,再如何去找錯誤呢?(這個有一個前提,就是不能提早已知錯誤的語句)
  • 問題4解決方案:
    我目前尚未找到答案,感受這個問題本身太較真了,或者再後面仍是能夠利用自定義異常來編寫,因此感受問的這個問題價值不是很高,可是由於這個問題我仍是進行了思考的,因此仍是記錄下來。

  • 問題5:語句System.errSystem.out的具體用法?
  • 問題5解決方案:其實這個算是老師在課上留給咱們的一個自主的課下任務,我比較感興趣也就查了一下:
    一、out:「標準」輸出流。此流已打開並準備接受輸出數據。一般,此流對應於顯示器輸出或者由主機環境或用戶指定的另外一個輸出目標。
    二、err:「標準」錯誤輸出流。此流已打開並準備接受輸出數據。一般,此流對應於顯示器輸出或者由主機環境或用戶指定的另外一個輸出目標。按照慣例,此輸出流用於顯示錯誤消息,或者顯示那些即便用戶輸出流(變量 out 的值)已經重定向到一般不被連續監視的某一文件或其餘目標,也應該馬上引發用戶注意的其餘信息。
    out和err的一個區別是,out每每是帶緩存的,而err沒有緩存(默認設置,能夠改)。因此若是你用標準出錯打印出來的東西能夠立刻顯示在屏幕,而標準輸出打印出來的東西可能要再積累幾個字符才能一塊兒打印出來。若是你在應用中混用標準輸出和標準出錯就可能看到這個問題。
    測試代碼:
public class Test2 {
  static{
    System.out.println("1");
  }
  public static void main(String[] args) {
    System.err.println("2");
    new Test2();
  }
  public Test2() {
    System.out.println("3");
  }
 }

實驗結果:
1,3的位置相對不變,2的位置隨機出現

  • 問題6:寫入和讀取文件的幾種方式?
  • 問題6解決方法:
import java.io.*;
public class FileTest {
    public static void main(String[] args) throws IOException {
        //(1)文件建立(文件類實例化)
        File file = new File("C:\\Users\\besti\\Desktop\\FileTest","HelloWorld.txt");
        if (!file.exists()){
            file.createNewFile();
        }
        //(2)文件讀寫
        //第一種:字節流讀寫,先寫後讀
        OutputStream outputStream1 = new FileOutputStream(file);
        byte[] hello = {'H','e','l','l','o',',','W','o','r','l','d','!'};
        outputStream1.write(hello);

        InputStream inputStream1 = new FileInputStream(file);
        while (inputStream1.available()> 0){
            System.out.print((char) inputStream1.read()+"  ");
        }
        inputStream1.close();
        //============================BufferedInputStream====================================
        byte[] buffer = new byte[1024];
        String content = "";
        int flag = 0;
        InputStream inputStream2 = new FileInputStream(file);
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream2);

        while ((flag =bufferedInputStream.read(buffer))!=-1){
            content += new String(buffer,0,flag);
        }
        System.out.println(content);
        bufferedInputStream.close();
//====================================BufferedOutputstream================================================
        OutputStream outputStream2 = new FileOutputStream(file);
        BufferedOutputStream bufferedOutputStream2 = new BufferedOutputStream(outputStream2);
        String content2 = "寫入文件的緩衝區內容";
        bufferedOutputStream2.write(content2.getBytes(),0,content2.getBytes().length);
        bufferedOutputStream2.flush();
        bufferedOutputStream2.close();
        //第二種:字符流讀寫,先寫後讀(兩種讀)
        Writer writer2 = new FileWriter(file);
        writer2.write("Hello, I/O Operataion!");
        writer2.flush();
        writer2.append("Hello,World");
        writer2.flush();

        BufferedWriter bufferedWriter = new BufferedWriter(writer2);
        String content3 = "使用bufferedWriter寫入";
        bufferedWriter.write(content3,0,content3.length());
        bufferedWriter.flush();
        bufferedWriter.close();

        Reader reader2 = new FileReader(file);
        System.out.println();
        while(reader2.ready()){
            System.out.print((char) reader2.read()+ "  ");
        }
        BufferedReader bufferedReader = new BufferedReader(reader2);
        while ((content =bufferedReader.readLine())!= null){
            System.out.println(content);
        }
    }
}

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

  • 問題1:在編寫一次課上做業的時候,第一次我是這樣編的,當時覺得對了,在最後一秒發現,這樣的編法沒有用遞歸...

  • 問題1解決方案:在周圍同窗的忽然一點下,知道本身在後面的靜態方法裏沒有用遞歸,因此趕忙作出了改變:

ps:紅圈是第一次與第二次不一樣的地方,也是錯誤的地方。

  • 問題2:在編寫另一次家庭做業就是那個I/O流的做業裏,在編程中本身遇到了不少問題,在方案中一一點出,並講說明本身當時的解決方法和思路
  • 問題2解決方案:首先我第一次編好的程序是這樣的:
import java.io.*;
import java.util.Arrays;
import java.util.Scanner;
public class homework1 {
    public static void main(String[] args) throws IOException{
    File file = new File("D:\\test","Test.txt");
        if (!file.exists()){
            file.createNewFile();}
        String a;
        Scanner scan = new Scanner(System.in);
        System.out.println("輸入幾個數字: ");
        a=scan.nextLine();
        Writer writer = new FileWriter(file);
        writer.write(a);
        writer.flush();
Reader reader = new FileReader(file);
        System.out.println();
        while (reader.ready()){
            System.out.print((char)reader.read()+ "");
        }
        String str = a.replaceAll(" ", "");
        char[] b=new char[str.length()];

       int in = 0;
        while (in<=str.length()-1)
        {
            b[in]=str.charAt(in);
            in++;
        }
        System.out.println();
        insertionSort(b);
 System.out.println("排序後:" + Arrays.toString(b));
 FileWriter fw = new FileWriter("D:\\test\\Test.txt");
        String q = "";
        for(int i=0;i<b.length;i++){
            q += b[i] + ",";
        }
        fw.write(q);
        fw.flush();
        fw.close();
}
private static void insertionSort(char[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int temp = arr[i];
            int j = i - 1;
            while (j >= 0 && temp < arr[j]) {
                arr[j + 1] = arr[j];
                j--;
            }
            arr[j + 1] = (char) temp;
        }

    }
}

輸出結果後,是這個樣子的:

就出現問題了;
- 我雖然分開輸入了不一樣位數的數字,可是最後程序把它們分紅了一個個數字,也就是這個程序只能排列0~9之間的數字;
因而我就想着能不能把它們先分開,再將一個個總體寫入數組裏,就開始寫:
一、首先我用了這個語句String[] sourceStrArray = a.split(" ");將其以空格做爲分界,把一個個分開之後存進數組;
二、後來就發現,一個是int類型的數組,一個是String型的數組,不匹配,因此就想着用Integer.parseInt,可是有個問題,這個貌似不能用在數組裏,因此用了很長時間研究,用了這樣一段代碼實現了轉換:

int[] t = new int[b.length];
            for (int i = 0; i < b.length; i++) {
                t[i] = Integer.parseInt(b[i]);
            }

而後輸出:

就ok啦!!

代碼託管

上週考試錯題總結

  • 錯題1
    Character streams manage
    A. byte-sized data
    B. binary data
    C. Unicode characters
    D. ASCII characters
    E. compressed data

    正確答案: C  個人答案: B

解析:字符流用於管理16位Unicode字符。這與字節流不一樣,後者用於管理任何種類的字節大小的數據,包括ASCII字符和其餘類型的二進制數據。

  • 錯題2
    A processing stream is a data stream that
    A. can manage both input streams and output streams at the same time
    B. performs some manipulation or process on the data
    C. can only manage input streams
    D. operates on input and output devices but not files
    E. can manage byte streams and character streams at the same time

    正確答案: B  個人答案: E

解析:數據流表示特定的源或目標流,用於輸入或輸出。處理流就像數據流,其中一些額外的處理被添加到輸入或輸出。例如,處理字節流可能會輸入文件中的全部項目,並刪除任何不是數字的ASCII字符,以便預期爲數字的輸入不會引起NumberFormatException。

  • 錯題3
    Assume infield is a Buffered Reader for a textile and that the textile is empty. What is returned from the message infile.readLine ( );
    A. 0
    B. null
    C. a special character known as the End-of-file marker (EOF)
    D. none of the above, the message causes a NullPointerException to be thrown
    E. none of the above, the message causes a EndOfFileException to be thrown

    正確答案: B  個人答案: D

解析:readLine()方法返回一個等於文件中下一個文本項的String。若是文件爲空,則返回null。

  • 錯題4
    Print Writer is a better output stream class that Print Stream because Print Writer
    A. has both print and println methods and PrintStream only has print
    B. can output both byte and character streams and PrintStream can only output byte streams
    C. has error checking mechanisms as part of the class and PrintStream does not
    D. will not throw checked exceptions and PrintStream will
    E. all of the above

    正確答案: C  個人答案: E

解析:PrintWriter類是一個Writer類,而PrintStream類是一個Stream類。主要區別在於PrintWriter專門用於文件,所以具備不屬於PrintStream的錯誤檢查機制。

結對及互評

  • 本週結對學習狀況
  • 博客中值得學習的或問題:
    • 內容詳略得當;
    • 代碼調試環節比較詳細;
  • 基於評分標準,我給本博客打分:5分。得分狀況以下:
  1. 正確使用Markdown語法(加1分):
  2. 模板中的要素齊全(加1分)
  3. 教材學習中的問題和解決過程, 一個問題加1分
  4. 代碼調試中的問題和解決過程, 一個問題加1分

  • 博客中值得學習的或問題:
    • 內容詳略得當;
    • 代碼調試環節比較詳細;
  • 基於評分標準,我給本博客打分:9分。得分狀況以下:
  1. 正確使用Markdown語法(加1分):
  2. 模板中的要素齊全(加1分)
  3. 教材學習中的問題和解決過程, 一個問題加1分
  4. 代碼調試中的問題和解決過程, 一個問題加1分

其餘

  • 這一週雖然說節奏依舊很快可是仍是跟上了,或許是由於上週週末比較開心再加上啦啦操即將結束的緣故,本身在給學習擠時間的爭分奪秒老是讓我非常爲本身所感動,這一週的編程項目和學習內容我自身而言不是特別難,首先特別想說的就是,其實我發現僞代碼不必定要寫出來,我這一週,有幾個項目都是晚上睡覺實在睡不着,就像如何讓一個項目實現,想各類辦法,記住,次日起來想寫下來,有空餘時間就趕快進行編寫,其實本身的學習狀態也在慢慢找回,由於以前時間的太少讓我老是以爲本身要跟不上了,的確,本身和班級的前列已經拉開了十分左右的距離,實際上是不小的距離了,有時候以爲本身放棄,對不起這麼久的努力,不放棄,總以爲本身有時候學習的時間都被各類各樣本身不能拒絕的活動所佔據,因而就想着週末學習,可是啦啦操的疲憊,讓週末的我身心疲憊,就是那一種,有心而力不足的感受,其實最近又想了想,說累,難道只有我一我的累麼,不;說事情多,也並非只有我一我的事情多,因此,我不是特殊的,因此我也沒有想着把累、苦掛在嘴上;我記得在高考完,本身特別指望的生活就是這種天天都忙忙碌碌,由於我以爲年輕人,乘着年輕,爲什麼不拼一把,乘着年輕,爲什麼不努力一把呢,人也就這樣一生,也就只能這樣真正年輕過一次,抓住着有限的時間,我要爲了本身的不後悔,作出更多讓本身之後佩服本身的事情!!!!!

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積)
目標 5000行 30篇 400小時
第一週 156/156 1/1 15/15
第二週 217/371 1/2 20/35
第三週 233/604 2/4 20/55
第四周 1382/1986 1/5 35/90
第五週 146/2196 1/6 25/115
第六週 462/2658 1/7 15/130
第七週 856/3514 1/8 20/150
第八週 1877/5391 3/11 20/170
第九周 1747/7138 1/12 20/190

參考資料

Java程序設計
藍墨雲
java基礎(System.err和System.out)詳解
java的異常和錯誤有什麼區別
java中error和exception的區別

相關文章
相關標籤/搜索