访问Java类中的变量时获取NullPointerException

时间:2010-10-23 21:58:53

标签: java arrays class nullpointerexception

在Java类中设置变量时遇到问题

这是我的代码

这是我创建实例的地方(IdeaInfo是一个类似于Struct的类):

IdeaInfo[] IDEAS = new IdeaInfo[100];
String[] TITLES = new String[100];

这是将使用这些实例的函数:

    try {
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
            // This is adding title to array Ideas and Titles
            if(mode % 3 == 0)   {
                IDEAS[ideas_pos].setTitle(sb.toString());
                TITLES[titles_pos] = sb.toString();
                titles_pos++;
                mode++;
            }
            // This is adding the content to array Ideas
            else if(mode % 3 == 1)  {
                IDEAS[ideas_pos].mContent = sb.toString();
                mode++;
            }
            // This is adding the rating to array Ideas
            else if(mode % 3 == 2)  {
                IDEAS[ideas_pos].mRating = Float.valueOf(sb.toString().trim()).floatValue();
                ideas_pos++;
                mode++;
            }
        }
    }

这就是我在IdeaInfo类中的内容:

public class IdeaInfo {

    public String mTitle = new String();        // Store the Idea's title
    public String mContent = new String();  // Store the Idea's title
    public float mRating;       // Store the Idea's Rating

    /*
     * Function that set the Idea's title
     */
    public void setTitle(String temp){
      mTitle = temp;
    }
}

显然,错误发生在try中,恰好在IDEAS[ideas_pos].setTitle(sb.toString()); 调试器表明我正在访问NullPointerException,这对我来说没有任何意义,因为我已经在类中初始化了这些变量。

顺便说一句,我将ideas_pos初始化为0。

5 个答案:

答案 0 :(得分:7)

初始化数组时,并不意味着您已初始化其成员。

IDEAS[x]null。您需要通过以下方式对其进行初始化:

IDEAS[ideas_pos] = new IdeaInfo();

答案 1 :(得分:3)

我讨厌说出来,但你的代码应该重新设计并重新编写。

  1. 首发sb.append(text + "/n")完全滥用StringBuilder。使用:sb.append(text).append('\n')
  2. 您永远不会清除或创建新的StringBuilder,当您到达Float.valueOf()部分时,您的构建器会附加大量文字。
  3. 我建议在IdeaInfo切换部件上创建0并存储在数组中,以便稍后可以引用其值
  4. IdeaInfo - 不要创建空字符串(更喜欢简单地指定"")。

答案 2 :(得分:2)

看起来列表中的项目为空。尝试追加:

if(IDEAS[ideas_pos] == null) {
    IDEAS[ideas_pos] = new IdeaInfo();
}

同样适用于标题。

答案 3 :(得分:1)

java中的数组初始化为“clean”,即所有元素都设置为null或“0”(适用于数组类型的任何元素)。当你写

IdeaInfo[] IDEAS = new IdeaInfo[100];

JVM会将其视为您编写的

IdeaInfo[] IDEAS = new IdeaInfo[100];
for (int i = 0; i < 100; i++) {
    IDEAS[i] = null;
}

如果您从C或C ++这样的语言来使用Java,这需要一些习惯,这些语言具有不同的初始化数组约定。

答案 4 :(得分:0)

Sammm

  1. 如上所述,您需要为每个数组“插槽”创建IdeaInfo个实例。

  2. [改进代码]将所有数据字段设为私有 - 提供公共访问器(或者更好的是,在类上正常运行的方法 - get / set方法是EVIL!)。 封装是OO中的头号黄金法则。

    • 问问自己当你需要在6个月内更改IdeaInfo的实现时会发生什么,并且你有很多其他代码直接依赖于(改变)成员变量状态 - 你有一个维护问题!
    • 封装数据使得推理更容易 - 您知道状态如何更改(仅通过方法) - 类更容易正确。
  3. 将字符串数据字段初始化为“”,而不是浪费内存的new String()(所有空字符串都将引用单个String对象)。