1. 程式人生 > >本週學習總結JAVA

本週學習總結JAVA

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 Main {

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

        System.out.println(Arrays.toString(content));//列印陣列內容
    }

}

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

將必須要執行的操作放在finally塊,因為finally塊中程式碼一定會執行,注意要進行try catch,因為關閉資源時可能出現異常

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

public class Main {

    public static void main(String[] args) throws IOException {
        
        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)
        {
         System.out.println(e);
        }
        System.out.println(Arrays.toString(content));//列印陣列內容
    }
}

使用try-with-resource語句,會自動呼叫close函式,關閉資源,相比前面的程式碼,更加簡潔,方便

7. 讀取檔案並組裝物件

實驗任務書中中的題目3:讀取檔案並組裝物件

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

public class ReadFile201721123039 {
   private static Scanner in;
   public static void main(String[] args) {
       // TODO Auto-generated method stub
       ArrayList<User>student=new ArrayList<User>();
       try{
           int count=0;
           Scanner sc = new Scanner(new File("D:/身份資訊.txt"));
           while(sc.hasNextLine()){
               String line = sc.nextLine();
             
               count++;
               Scanner lineScanner = new Scanner(line);//為每一行建立一個掃描器
               
               lineScanner.useDelimiter(" ");
               try{
                   String a1 = lineScanner.next();//姓名
                   String a2 = lineScanner.next();//身份證號
                   String a3 = lineScanner.next();//性別
                   String a4 = lineScanner.next();//年齡
                   String a5 = lineScanner.next();//地址
                   
                   System.out.println(a1+a2+a3+a4+a5);
                   try {
                       if (a1.length()==0)
                           throw new Exception("姓名為空");
                       if (a2.length()==0||a2.length()!=18)
                           throw new Exception("身份證號格式錯誤");
                       
                       if (a3.length()==0)
                           throw new Exception("性別未填寫");
                       if (!a3.equals("男") && !a3.equals("女")) 
                           throw new Exception("性別格式錯誤");
                       if (a4.length()==0)
                           throw new Exception("年齡未填寫");
                       if (a5.length()==0)
                           throw new Exception("地址未填寫");
                   } catch (Exception e) {
                       System.out.println(e+":"+count+":"+line);
                  }
              }catch(Exception e){
                  System.out.println(e+":"+count+":"+line);
              }
          }
          
      }catch(FileNotFoundException e){
          System.out.println(e);
      
      }
        Collections.sort(student, (User o1,User o2)->{;
            return o1.getAge()-o2.getAge();
        });
        for(User user:student)
        {
            System.out.println(user.toString());
        }
       }
  }

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

將直接輸出到控制檯改為丟擲異常