1. 程式人生 > >統計工作空間中的Java程式碼的行數

統計工作空間中的Java程式碼的行數

    我們現在有這樣一個需求,統計出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();
			}
			
		}
	}
	
}

執行結果為正常數值,不會出現空指標異常。