Java作業09-異常
阿新 • • 發佈:2018-11-19
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。如果關閉檔案失敗,提示關閉檔案失敗!
程式碼改造:
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { @SuppressWarnings("resource") Scanner sc = new Scanner(System.in); byte[] content = null; FileInputStream fis = null; while (true) { String file = sc.next(); try { fis = new FileInputStream(file); 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("找不到檔案 " + file + ",請重新輸入檔名"); } catch (Exception e) { System.out.println("開啟或讀取檔案失敗!"); } finally { try { System.out.println("關閉檔案ing"); 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來改寫上述程式碼實現自動關閉資源。簡述這種方法有何好處?
使用try-with-resources改寫後:
byte[] content = null; try(FileInputStream fis = new FileInputStream("testfis.txt")){ int bytesAvailabe = fis.available();//獲得該檔案可用的位元組數 if(bytesAvailabe>0){ content = new byte[bytesAvailabe];//建立可容納檔案大小的陣列 fis.read(content);//將檔案內容讀入陣列 } }catch(Exception e){ e.printStackTrace(); } System.out.println(Arrays.toString(content));
好處:簡化程式碼,在try語句塊執行結束後,自動呼叫close()函式,自動關閉資源。
7. 讀取檔案並組裝物件(檔案ReadFileUsingScanner.java)
7.1 給出關鍵程式碼(需出現你的學號)。額外要求:捕獲異常時,將錯誤的資訊按照出錯原因:行號:該行內容格式輸出。
關鍵程式碼
import java.io.File;
import java.io.FileNotFoundException;
import java.util.NoSuchElementException;
import java.util.Scanner;
public class ReadFileUsingScanner {
public static <User> void main(String[] args) throws FileNotFoundException {
Scanner in = new Scanner(new File("身份證號.txt"));//為myfile.txt這個File建立一個掃描器in
int n = in.nextInt();
while (in.hasNextLine()) {
String line = in.nextLine();// 讀出myfile.txt的下一行
n++;
@SuppressWarnings("resource")
Scanner lineScanner = new Scanner(line);// 為每一行建立一個掃描器
lineScanner.useDelimiter(" ");// 使用空格作為分隔符
try {
String name = lineScanner.next();// 姓名
String id = lineScanner.next();// 身份證號
String gender = lineScanner.next();// 性別
String age = lineScanner.next();// 年齡
String address = lineScanner.next();// 地址
while (lineScanner.hasNext()) {// 謹防地址只有一段
address += lineScanner.next();
}
System.out.println(name+id+gender+age+address);
} catch (NoSuchElementException e) {
System.out.println("錯誤原因:"+ e + "行號:"+n+"該行內容為:" + line);
}
}
in.close();
}
}