Java 習題7和習題10 參考答案及解析

請說出下列程序的輸出結果。

import java.io.IOException;

public class E {
    public static void main(String args[]) {
        try {
            methodA();
        } catch (IOException e) {
            System.out.println("你好");
            return;
        } finally {
            System.out.println("fine thanks");
        }
    }

    public static void methodA() throws IOException {
        throw new IOException();
    }
}

答案:你好
fine thanks
一個方法在聲明時可以使用throws關鍵字聲明要產生的若干個異常,並在該方法的方法體中具體給出產生異常的操作,即用相應的異常類創建對象,並使用throw關鍵字拋出異常對象,導致該方法結束執行。try-catch語句捕獲到這個異常,輸出你好。
在執行try-catch語句後,執行finally子語句,也就是說,無論在try部分是否發生過異常,finally子語句都會被執行。
如果在try-catch語句中執行了return語句,那麼finally子語句依然會被執行,
try-catch語句中執行了程序退出代碼,即執行System.exit(0);,則不執行finally子語句。


問答題

(1)如果準備按字節讀取一個文件的內容,應當使用FileInputStream流還是FileReader流?
(2)FileInputStream流的read方法和FileReader流的read方法有何不同?
(3)BufferedReader流能直接指向一個文件嗎?


問答題解析

1.使用FileInputStream。
2.FileInputStream按字節讀取文件,FileReader按字符讀取文件。
3.不可以。


選擇題

(1)下列哪個敘述是正確的?
A. 創建File對象可能發生異常。
B. BufferedRead流可以指向FileInputStream流
C. BufferedWrite流可以指向FileWrite流
D.RadomAccessFile流一旦指向文件,就會刷新該文件


(2)爲了向文件hello.txt尾加數據,下列哪個是正確創建指向hello.txt的流?
A. try{ OutputStream out = new FileOutputStream(“hello.txt”);
}
catch(IOException e){}
B. try { OutputStream out = new FileOutputStream(“hello.txt”,true);
}
catch(IOException e){}
C.try{ OutputStream out = new FileOutputStream(“hello.txt”,false);
}
catch(IOException e){}
D.try{ OutputStream out = new OutputStream(“hello.txt”,true);
}
catch(IOException e){}


選擇題解析

(1).答案:C
創建File對象不會發生異常,創建新文件的時候會發生IOException異常。
BufferedRead流只能指向FileRead流,它們都是以字符讀取數據的。
RadomAccessFile流指向文件時,不刷新文件。


(2)答案:B
FileOutputStream類是文件字節輸出流,它是OutputStream類的子類,所以FileOutputStream的實例方法都是從OutputStream類繼承來的,那麼在這道題中需要使用上轉型對象才能調用重寫父類的方法,排除D。ABC在於FileOutpurStream的構造方法的不同,題目要求向文件尾加數據,A選項是具有刷新功能的構造方法,也就是會覆蓋掉原來文件的數據,B選項參數爲true表示不會刷新所指向的文件,而是從文件的末尾開始向文件寫入數據,取值爲false,輸出流將刷新所指向的文件。


閱讀程序題

請說出E類中標註的【代碼1】~【代碼4】的輸出結果。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class E {
    public static void main(String args[]) {
        int n = -1;
        File f = new File("hello.txt");
        byte[] a = "abcd".getBytes();
        try {
            FileOutputStream out = new FileOutputStream(f);
            out.write(a);
            out.close();
            FileInputStream in = new FileInputStream(f);
            byte[] tom = new byte[3];
            int m = in.read(tom, 0, 3);
            System.out.println(m);          //【代碼1】
            String s = new String(tom, 0, 3);
            System.out.println(s);            //【代碼2】
            m = in.read(tom, 0, 3);
            System.out.println(m);            //【代碼3】
            s = new String(tom, 0, 3);
            System.out.println(s);            //【代碼4】
        } catch (IOException e) {

        }
    }

}

答案:【代碼1】:3。【代碼2】:abc。【代碼3】:1。【代碼4】:dbc。

getBytes方法將此字符串編碼爲字節序列,將結果存儲到新的字節數組中,之後用輸出流將字節數組a中的內容寫入到了文件hello.txt中;之後聲明一個新的byte數組com大小爲3個字節,使用輸入流的read方法,從數組com的第0個位置開始,依次從文件中讀取3個字節寫入數組中,返回實際讀取的字節數目。所以【代碼1】輸出3;之後用聲明一個String對象,使用了帶三個參數的構造方法,從字節數組的第0個位置開始,提取出3個字節創建一個新的String對象;那麼【代碼2】輸出的結果就是abc,只要不關閉流,每次調用read方法就順序地讀取源中其餘的內容,直到源的末尾或流被關閉。
所以再次調用read方法只讀取了剩餘的一個字符d寫入到tom數組的第0個位置上,返回實際讀取的字節數目爲1,所以【代碼3】返回1,此時再新聲明一個String對象,還是從tom的第0個位置開始提取3個字節,那麼輸出的結果就應該是dbc。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章