2015-04-05 40 views
1

我正在編寫一種方法,可以返回文本文件中出現的所有行號。 例如,如果「你好」是參數,它會如果我的測試文件說搜索我的文本文件,並返回所有行號「你好」發生在返回文本文件中出現的所有行號的方法

Hello
my name is
is Java.

和我的參數該方法是 「我的」,它應該返回:

[2,3]

不過,我得到這個錯誤:

Exception in thread "main" java.lang.NullPointerException
at Indexer.lineNumbers(Indexer.java:41)
at Indexer.main(Indexer.java:22)

這是我的代碼:

public static String lineNumbers(String x) throws FileNotFoundException, IOException 
    { 
      LineNumberReader lineReader = new LineNumberReader(new FileReader("File.txt")); 
      Scanner fileScanner = new Scanner(new File("File.txt")); 
      String numbers = "["; 
      while (fileScanner.hasNextLine()) 
      { 
       String line = lineReader.readLine(); 
       if (line.contains(x)) 
       { 
        int lineNumber = lineReader.getLineNumber(); 
        String numberString = Integer.toString(lineNumber); 
        numbers = (numbers + "," + numberString); 
       } 
      } 
      return numbers + "]"; 
    } 

我在做什麼錯?

+0

什麼行是你的代碼#41行?無論您在該行中訪問的對象是否爲空。它可能是'如果(line.contains(x))'?也許'線路'在某些時候是空的。 – 2015-04-05 05:31:22

+1

另外,在你的例子中,我認爲你的意思是「是」,而不是「我的」:) – 2015-04-05 05:31:48

+1

因爲'LineNumberReader'和'Scanner'是分開的對象。 'fileScanner.hasNextLine()'總是爲真 - 當你從'lineReader'中讀取時它不會變爲false。但'readLine()'一旦'lineReader'到達流的末尾就返回null。 – 2015-04-05 05:33:13

回答

3

您正在嘗試使用掃描儀和線路閱讀器閱讀相同的文件,因此您最終踩在自己的腳趾上。

試試這個:

public static String lineNumbers(String x) throws IOException 
{ 
    LineNumberReader lineReader = new LineNumberReader(new FileReader("/Users/alfasi/tpstats-eu-west-1.log")); 
    String numbers = ""; 
    String line; 
    while ((line = lineReader.readLine()) != null) 
    { 
     if (line.contains(x)) 
     { 
      numbers += "," + lineReader.getLineNumber(); 
     } 
    } 
    return "[" + numbers.substring(1) + "]"; 
} 
1

你可以考慮另一種放線號在一個ArrayList,然後可以在另一個進程遍歷:

public static ArrayList<Integer> lineNumbers(String x) 
     throws FileNotFoundException, IOException { 
    ArrayList<Integer> lineNumbers = new ArrayList<Integer>(); 
    Scanner fileScanner = new Scanner(new File("File.txt")); 
    int lineNumber = 0; 
    while (fileScanner.hasNextLine()) { 
     String line = fileScanner.nextLine(); 
     lineNumber++; 
     if (line.contains(x)) { 
      lineNumbers.add(lineNumber); 
     } 
    } 
    return lineNumbers; 
} 

然後嘗試遍歷值,你得到這樣的:

String searchFor = "is"; 
for(int i : lineNumbers(searchFor)) { 
    System.out.println(i); 
} 
相關問題