我正在编写一个方法,它返回文本文件中出现的所有行号。 例如,如果"你好"是参数,它会搜索我的文本文件并返回所有行号"你好"发生在。
如果我的测试文件说:
您好
我的名字是 是Java。
我方法的参数是"我的",它应该返回:
[2,3]
但是,我收到此错误:
线程中的异常" main"显示java.lang.NullPointerException
在Indexer.lineNumbers(Indexer.java:41)
在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 :(得分: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 :(得分: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);
}