統計工作空間中的Java程式碼的行數
阿新 • • 發佈:2018-12-23
我們現在有這樣一個需求,統計出eclipse的工作空間中java檔案的中java程式碼的總行數。考慮的思路如下:
首先我們需要將目錄裡的檔案全找出來,然後過濾出java檔案。再按行讀入檔案,每讀一行計數一次。對於找檔案,我們構造了一個方法Num,使用遞迴方法,找出所有的檔案。詳細程式碼如下所示:
package Demo; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; public class javaLineCount { static int javaLineCount=0; public static void main(String[] args) throws IOException { File file=new File("E:\\workplace"); Num(file); System.out.println(javaLineCount); } //構造統計方法Num private static void Num(File file) throws IOException { //判斷檔案是否為空 if (file==null) { throw new IOException(); } //判斷是否為目錄 if (file.isDirectory()) { File[] fs=file.listFiles(); for (File ff:fs) { Num(ff); } }else { BufferedReader reader=new BufferedReader(new FileReader(file)); if (file.getName().endsWith(".java")) { while (reader.readLine()!=null) { javaLineCount++; } reader.close(); } } } }
執行結果為正確的行數,親測可用。
現在又有這樣一個需求,我們經常工作空間直接在一個碟符裡而不是在一個資料夾中,我使用的是E盤,程式碼如下(僅僅改變的路徑,程式碼跟上面一樣):
package Demo; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; public class javaLineCount { static int javaLineCount=0; public static void main(String[] args) throws IOException { File file=new File("E:\\"); Num(file); System.out.println(javaLineCount); } //構造統計方法Num private static void Num(File file) throws IOException { //判斷檔案是否為空 if (file==null) { throw new IOException(); } //判斷是否為目錄 if (file.isDirectory()) { File[] fs=file.listFiles(); for (File ff:fs) { Num(ff); } }else { BufferedReader reader=new BufferedReader(new FileReader(file)); if (file.getName().endsWith(".java")) { while (reader.readLine()!=null) { javaLineCount++; } reader.close(); } } } }
我們可以發現根本沒有得到我們想要的結果,而是出現了空指標異常,為什麼我們會出現空指標異常,為什麼會出現這樣的效果,我們進行了探索。我在Num方法中對其進行了列印,結果我們可以看到,最後一行出現:E:\System Volume Information,這是Windows系統自帶的檔案,我們java程式讀取不了它,因此它給我們一個NullPointerException。怎麼解決呢?
我們對方法Num進行異常的捕獲,可以得到正確的結果。
package Demo; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; public class javaLineCount { static int javaLineCount=0; public static void main(String[] args) throws IOException { File file=new File("E:\\"); try { Num(file); } catch (Exception e) { e.printStackTrace(); } System.out.println(javaLineCount); } //構造統計方法Num private static void Num(File file) throws IOException { //判斷檔案是否為空 if (file==null) { throw new IOException(); } //判斷是否為目錄 if (file.isDirectory()) { File[] fs=file.listFiles(); for (File ff:fs) { System.out.println(ff);// Num(ff); } }else { BufferedReader reader=new BufferedReader(new FileReader(file)); if (file.getName().endsWith(".java")) { while (reader.readLine()!=null) { javaLineCount++; } reader.close(); } } } }
執行結果為正常數值,不會出現空指標異常。