1. 程式人生 > >第11周任務-異常

第11周任務-異常

6. 為如下程式碼加上異常處理

byte[] content = null;
FileInputStream fis = new FileInputStream("testfis.txt");
int bytesAvailabe = fis.available();//獲得該檔案可用的位元組數
if(bytesAvailabe>0){
    content = new byte[bytesAvailabe];//建立可容納檔案大小的陣列
    fis.read(content);//將檔案內容讀入陣列
}
System.out.println(Arrays.toString(content));//列印陣列內容

6.1 改正程式碼,並增加如下功能。當找不到檔案時,需提示使用者找不到檔案xxx,請重新輸入檔名,然後嘗試重新開啟。 如果是其他異常則提示開啟或讀取檔案失敗!。

注1:裡面有多個方法均可能丟擲異常。
功能2:需要新增finally關閉檔案。無論上面的程式碼是否產生異常,總要提示關閉檔案ing。如果關閉檔案失敗,提示關閉檔案失敗!

public class Main1 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        byte[] content = null;
        FileInputStream fis = null;
        while(true) {
            String str = sc.nextLine();
            try {
                fis = new FileInputStream(str);
                int bytesAvailabe = fis.available();//獲得該檔案可用的位元組數
                if(bytesAvailabe>0){
                    content = new byte[bytesAvailabe];//建立可容納檔案大小的陣列
                    fis.read(content);//將檔案內容讀入陣列
                    System.out.println(Arrays.toString(content));//列印陣列內容
                }
            }catch(FileNotFoundException e) {
                System.out.println("找不到檔案"+ str +"請重新輸入檔名");
            }catch(Exception e) {
                System.out.println("開啟或讀取檔案失敗!");
            }finally {
                System.out.println("關閉檔案ing");
                try {
                    fis.close();
                } catch (Exception e) {
                    System.out.println("關閉檔案失敗!");
                }
            } 
        }
    }
}

6.2 結合題集6-2程式碼,要將什麼樣操作放在finally塊?為什麼?使用finally關閉資源需要注意一些什麼?

finally無論是否被捕獲都會執行,但是finally內部的執行語句也可能會有異常,所以在finally的內部我們也要加上try-catch。

6.3 使用Java7中的try-with-resources來改寫上述程式碼實現自動關閉資源。簡述這種方法有何好處?

public class Main2 {
    public static void main(String[] args) throws IOException{
        byte[] content = null;
        try(FileInputStream fis = new FileInputStream("testfis.txt")){//在try的圓括號中寫入將要關閉資源的物件
        int bytesAvailabe = fis.available();//獲得該檔案可用的位元組數
        if(bytesAvailabe>0){
            content = new byte[bytesAvailabe];//建立可容納檔案大小的陣列
            fis.read(content);//將檔案內容讀入陣列
        }
        }catch(Exception e){
            System.out.println(e);
        }
        System.out.println(Arrays.toString(content));//列印陣列內容
    }
}

Java7中提供了自動嘗試關閉資源的語法,可將嘗試自動關閉資源的物件生成寫在try之後的圓括號中,無需判斷是否為null,也避免了在關閉時產生的其它異常

7.讀取檔案並組裝物件

public class ReadFileUsingScanner{
    public static void main(String[] args)  throws FileNotFoundException{
        Scanner in = new Scanner(new File("身份證號.txt"));//為myfile.txt這個File建立一個掃描器in
        while(in.hasNextLine()){
            String line = in.nextLine();//讀出myfile.txt的下一行
            
            Scanner lineScanner = new Scanner(line);//為每一行建立一個掃描器
            //System.out.println("lineScanner="+lineScanner);
            lineScanner.useDelimiter(" ");//使用空格作為分隔符
            //System.out.println(line);
            String a1 = lineScanner.next();//姓名
            String a2 = lineScanner.next();//身份證號
            String a3 = lineScanner.next();//性別
            String a4 = lineScanner.next();//年齡
            String a5 = lineScanner.next();//地址
            while(lineScanner.hasNext()){//謹防地址只有一段
                a5 += lineScanner.next();
            }
            System.out.println(a1+a2+a3+a4+a5);
        }
        in.close();
    }
}

7.1 給出關鍵程式碼(需出現你的學號)。額外要求:捕獲異常時,將錯誤的資訊按照出錯原因:行號:該行內容格式輸出。

public class ReadFileUsingScanner {
    public static void main(String[] args) throws FileNotFoundException {
        Scanner in = new Scanner(new File("身份證號.txt"));// 為myfile.txt這個File建立一個掃描器in
        int n = 0;
        while (in.hasNextLine()) {
            String line = in.nextLine();// 讀出myfile.txt的下一行
            n++;
            try {
                Scanner lineScanner = new Scanner(line);// 為每一行建立一個掃描器
                // System.out.println("lineScanner="+lineScanner);
                lineScanner.useDelimiter(" ");// 使用空格作為分隔符
                // System.out.println(line);
                String a1 = lineScanner.next();// 姓名
                String a2 = lineScanner.next();// 身份證號
                String a3 = lineScanner.next();// 性別
                String a4 = lineScanner.next();// 年齡
                String a5 = lineScanner.next();// 地址
                while (lineScanner.hasNext()) {// 謹防地址只有一段
                    a5 += lineScanner.next();
                }
                System.out.println(a1 + a2 + a3 + a4 + a5);
            } catch (Exception e) {
                System.out.println(e + ":" + n + ":" + line);
            }
        }
        in.close();
    }

7.2 如果檔案有上萬行文字,出錯的資訊可能有很多行,如果將出錯資訊直接輸出到控制檯容易被忽略,請問如何解決?

將出錯資訊都寫入一個檔案裡然後再輸出。