【问题标题】:very specific java constructors and Object class problem非常具体的 java 构造函数和 Object 类问题
【发布时间】:2011-09-26 10:51:22
【问题描述】:

我在 actionTable.get(state) 有一个数组。 当我向数组添加一个对象时,即 Reduce,reduce 的属性似乎与它不符。 数组是 Action[] 类型,其中 Action 是 Reduce 的超类,这可能是原因吗?

将reduce添加到数组中:

actionTable.get(state)[t] = new Reduce(st.items.get(item).prod);

在添加之前检查字段头是否已定义:

System.out.println(Prod.prods.get(st.items.get(item).prod).head);

检查新添加的reduce是否有正确的head字段:

System.out.println(actionTable.get(state)[t].prod.head);

NullPointerException 出现在最后一个打印语句中。 .prod 部分已定义,但 .prod.head 为空,即使原始 prod 对象具有已定义的头部。 这是 Reduce 的构造函数:

Reduce(int pr) {
    p = pr;
    length = Prod.prods.get(pr).length;
    prod = Prod.prods.get(pr);

}

定义了构造函数中所有赋值的RHS。所以,我不明白为什么当您通过 actionTable 访问新 Reduce 可以访问的 prod 对象中的 head 字段时没有定义它。

【问题讨论】:

    标签: java class constructor superclass


    【解决方案1】:

    信任继承和所有。数组最有可能涉及不同的数组实例(如果您放大/复制数组引用)。更多 System.out.println 将对此有所帮助。

    【讨论】:

      【解决方案2】:

      您始终应该做的第一件事是:进入 IDE 中的断点视图,选中“抛出异常时停止”,并可能命名为 NullPointerException。 然后在调试器中运行你的代码,它会在抛出 NullPointerException 的地方停止。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-20
        • 1970-01-01
        • 2019-07-09
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 2013-08-26
        • 1970-01-01
        相关资源
        最近更新 更多