所以我追踪了这个问题,但我并没有更接近理解错误。以下是编译器所说的内容:
线程“main”中的异常java.lang.NullPointerException at BasicFile.Search(BasicFile.java:215)at TestFile.main(TestFile.java:42)
第215行是以while开头的第一行。
String Search(String key) throws IOException {
int lines = 0;
String line = "";
String foundAt = "";
BufferedReader BF = new BufferedReader(new FileReader(f));
try {
while ((line = BF.readLine().toLowerCase()) != null) {
lines++;
//create tokenizer words with what is in line
StringTokenizer words = new StringTokenizer(line);
while(words.hasMoreTokens()) { //while words has tokens left
//go to next token and compare to key
if (words.nextToken().equals(key.toLowerCase()))
foundAt = foundAt + "\n" + lines + ":" + line;
//do nothing continue loop
}
}
BF.close();
} catch(FileNotFoundException e) {
}
return foundAt;
}
答案 0 :(得分:2)
当缓冲读取器用完行时,它会返回null
。您试图在null上调用toLowerCase
方法,最终抛出空指针异常。
重构代码的方式是在确保行非空之前不要求您执行toLowerCase
。
例如:
String next;
while ((next = BF.readLine()) != null) {
String line = next.toLowerCase();
// ...
}
答案 1 :(得分:0)
while ((line = BF.readLine().toLowerCase()) != null)
如果BF.readline()返回null会发生什么?
答案 2 :(得分:0)
从测试中删除.toLowerCase()
答案 3 :(得分:0)
请停止,你的代码给我癌症!您需要修复的代码中存在许多样式错误。
search
,而不是Search
。BF
应该是什么意思?请将其替换为in
。 f
应作为参数传递。BufferedReader
是AutoCloseable
,因此您应该使用try-with-resources来处理关闭它。@param
记录其参数,使用@return
记录其参数,以及确切地为什么需要使用{{1}抛出IOException
}}。以下是您的代码的大部分修复版本:
@exception
现在,问题是/**
* Needs Javadoc
*/
String search(String key, File f) throws IOException {
int lines = 0
String line = "";
String foundAt = "";
try(BufferedReader in = new BufferedReader(new FileReader(f)) {
while ((line = in.readLine().toLowerCase()) != null) { //the line in question
lines++;
StringTokenizer words = new StringTokenizer(line);
while(words.hasMoreTokens())
if (words.nextToken().equals(key.toLowerCase()))
foundAt = foundAt + "\n" + lines + ":" + line;
}
} catch(FileNotFoundException e){}
return foundAt;
}
有时会返回in.readline()
。在null
上调用方法始终为null
。因此,当您尝试调用NullPointerException
缺少NullPointerException
方法时,您会收到null
。
您需要在之后将其转换为toLowerCase()
,确保它为非空。