【问题标题】:Getting NullPointerException when accessing a variable in a Java class [duplicate]访问 Java 类中的变量时出现 NullPointerException [重复]
【发布时间】:2011-04-29 17:01:06
【问题描述】:

在 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。

【问题讨论】:

  • 顺便说一句,您可以将new String() 替换为""

标签: java arrays class nullpointerexception


【解决方案1】:

当你初始化一个数组时,并不意味着你已经初始化了它的成员。

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

IDEAS[ideas_pos] = new IdeaInfo();

【讨论】:

    【解决方案2】:

    我不想这么说,但你的代码真的应该重新设计和重写。

    1. 对于开始sb.append(text + "/n") 是对StringBuilder 的完全滥用。使用:sb.append(text).append('\n')
    2. 您永远不会清除或创建新的StringBuilder,当您到达Float.valueOf() 部分时,您的构建器将附加大量文本。
    3. 我建议在0 开关部分创建IdeaInfo 并存储在数组中,以便您以后可以引用它的值
    4. IdeaInfo - 不要创建空字符串(最好简单地分配 "")。

    【讨论】:

      【解决方案3】:

      java 中的数组被初始化为“干净”,也就是说,所有元素都设置为null 或“零”(适用于数组类型)。当你写

      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】:

        列表中的项目似乎为空。尝试追加:

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

        同样适用于头衔。

        【讨论】:

          【解决方案5】:

          萨姆

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

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

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

          【讨论】:

            猜你喜欢
            • 2016-11-08
            • 2014-07-02
            • 2021-12-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-10-28
            • 2020-07-12
            相关资源
            最近更新 更多