Java中搜索方法的nullpointerexception

时间:2014-03-02 23:03:23

标签: java nullpointerexception

所以我追踪了这个问题,但我并没有更接近理解错误。以下是编译器所说的内容:

  

线程“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;
}

4 个答案:

答案 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)

请停止,你的代码给我癌症!您需要修复的代码中存在许多样式错误。

  • 首先关闭java中的,方法名称始终以小写字母开头。您使用Java编程,而不是使用C#编程,因此您需要使用Java命名约定。这意味着您的方法应该被称为search,而不是Search
  • 变量名称也是如此。无论如何,BF应该是什么意思?请将其替换为in
  • 接下来,除非此方法在表示该特定文件的对象中,否则全局变量f应作为参数传递。
  • BufferedReaderAutoCloseable,因此您应该使用try-with-resources来处理关闭它。
  • 您需要向其添加一个javadoc注释,使用@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() ,确保它为非空。