所以我正在尝试编写一个搜索txt文件中特定字符串的代码,然后打印出该字符串出现的所有行。
最直接的方法似乎是通过文档运行Scanner和LineNumberReader,添加符合“找到”字符串的帐单的行。但是,每当它偶然发现不包含该单词的行时,它会抛出NullPointerException并且无论如何都会杀死循环。谁能告诉我我做错了什么?
FileReader r = new FileReader(f);
LineNumberReader l = new LineNumberReader(r);
Scanner s = new Scanner(l);
int i = 1;
String found = "Instances of string found:\n";
{
while (s.hasNextLine()) {
try {
if (s.findInLine(keyword).isEmpty() == false) {
found = found + l.readLine() + "\n";
s.nextLine();
} else {
s.nextLine();
}
} catch (NullPointerException e) {
s.nextLine();
}
}
display(found, "Match found!");
}
答案 0 :(得分:1)
检查扫描仪的文档:如果在输入到下一行分隔符中未检测到此类模式,则返回null并且扫描仪的位置不变。
您致电s.findInLine(keyword).isEmpty() == false
,如果findInLine(keyword)
中未包含的字词为空,则您将调用null.isEmpty()
。你有例外;)
您无需检查isEmpty()
,s.findInLine(keyword)!= null
就足够了。
答案 1 :(得分:0)
如果您正在使用在某些情况下记录为返回null
的方法,那么您应该将方法的结果分配给变量(如果您要将其用于其他内容)并且使用==
或!=
将其测试为null。使用结果作为参考,然后依靠try/catch
NullPointerException
来查看它是否为null
,这是非常糟糕的编程习惯。首先,如果null
身体中的其他地方出现意外try
怎么办?现在它会因为错误的原因而捕获异常。 NullPointerException
始终表示程序错误。它永远不应该是“正常”程序逻辑的一部分。
至于为何“杀死循环”:它不应该。即使你使用try / catch是不好的做法,它应该仍然按我认为的方式工作,并且不应该杀死循环。我刚刚测试了类似于你的代码的东西,但是没有l.readLine()
,它似乎表现得很好。如果您想要行号,则为l.getLineNumber()
,而不是l.readLine()
,它会尝试读取一行文字并可能破坏Scanner
。