创建对象时出现空指针异常

时间:2014-06-03 17:03:10

标签: java nullpointerexception

我想知道有人可以帮我找出这个空指针异常。我正在制作一个程序来查找英语单词的所有字谜。我创建了一个类EnglishDictionary,当给出英文单词及其第一个字母的长度时,扫描包含所有英文单词的文本文件,并选择添加长度相同且包含ArrayList的第一个字母的文本文件。这是代码:

import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;

public class EnglishDictionary {

    public EnglishDictionary(String firstLetter, int wordLength) {
        ArrayList<String> words = new ArrayList<String>();
        processDict(firstLetter, wordLength);
    }

    public void processDict(String firstLetter, int wordLength) {
        try {
            FileReader fReader = new FileReader("englishWords.txt");
            BufferedReader reader = new BufferedReader(fReader);
            while (true) {
                String line = reader.readLine();
                if (line == null) {
                    break;
                } else {
                    if (line.length() == wordLength) {
                        words.add(line);
                    }
                }
            }
        } catch (IOException e) {
            System.out.println("File does not exist.");
        }
    }

    public ArrayList<String> getWords() {
        return words;
    }

    public void printWords() {
        for (String word : words) {
            System.out.println(word);
        }
    }

    private ArrayList<String> words;

}

正如您所看到的,我还没有添加检查第一个字母是否在所选英语单词中的功能。当我从另一个类创建一个EnglishDictionary对象时,我得到一个空指针异常。它说:

Exception in thread "main" java.lang.NullPointerException
    at EnglishDictionary.processDict(EnglishDictionary.java:23)
    at EnglishDictionary.<init>(EnglishDictionary.java:10)
    at Main.main(Main.java:6)

我似乎无法弄清楚这是从哪里来的。其他人可以看到吗?提前谢谢。

4 个答案:

答案 0 :(得分:6)

words未正确初始化。您正在初始化隐藏 CLASS 变量字的 LOCAL 变量字。

在构造函数中执行此操作:

public EnglishDictionary(String firstLetter, int wordLength) {
  //ArrayList<String> words = new ArrayList<String>();  // Creates a local variable called 'words'; class member does NOT get initialized.
  words = new ArrayList<String>(); // THIS initializes the class variable.
  processDict(firstLetter, wordLength);

}

答案 1 :(得分:3)

解决方案1 ​​

应该是这样的。实例变量words未初始化。

public EnglishDictionary(String firstLetter, int wordLength) {
    words = new ArrayList<String>();           // THIS LINE IS CHANGED
    processDict(firstLetter, wordLength);
}

解决方案2

在声明实例成员时初始化以避免NullPointerException

private ArrayList<String> words = new ArrayList<String>();

public EnglishDictionary(String firstLetter, int wordLength) {
    //ArrayList<String> words = new ArrayList<String>();    //REMOVE THIS LINE
    processDict(firstLetter, wordLength);
}

解决方案3

为了更安全,请使用 final 来避免在编译时捕获这类问题。

private final ArrayList<String> words; 

问题出在words.add(line);,因为words根本没有初始化。

答案 2 :(得分:0)

问题是范围问题。

你的方法:

public EnglishDictionary(String firstLetter, int wordLength) {
    ArrayList<String> words = new ArrayList<String>();
    processDict(firstLetter, wordLength);
}

实例化ArrayList单词,但单词的范围仅对此方法可见。因此,当在另一种方法中调用单词时,您会收到错误。

你可以通过在方法之外移动Arraylist单词并在方法中实例化它来解决这个问题:

ArrayList<String> words;


public EnglishDictionary(String firstLetter, int wordLength) {
    words = new ArrayList<String>();
    processDict(firstLetter, wordLength);
}

答案 3 :(得分:0)

在构造函数中将ArrayList<String> words = new ArrayList<String>();更改为words = new ArrayList<String>();

在第一种情况下,您将创建一个名为“word”的本地arraylist,其范围仅包含构造函数。但实际上你需要初始化实例变量'word'