【问题标题】:Why a NullPointer Exception from adding to a Collection? [duplicate]为什么添加到集合时出现 NullPointer 异常? [复制]
【发布时间】:2013-06-14 01:34:46
【问题描述】:

我正在尝试将对象添加到列表时为什么会收到 NullPointerException 的一些实验。下面是我的代码和 StackTrace。您知道为什么当我尝试将对象添加到列表时会收到 NullPointerException 吗?

这是我的测试课。

package com.greathouse.aggregationtest;

import com.greathouse.aggregationtest.types.Composite;
import com.greathouse.aggregationtest.types.InitializedComponent;
import com.greathouse.aggregationtest.types.NullComponent;
import com.greathouse.aggregationtest.types.NullContainingComponent;

public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Testing aggregation" );

        InitializedComponent initializedComponent1 = new InitializedComponent();
        initializedComponent1.setInitializedString("Test Initialization 1 Successful");

        InitializedComponent initializedComponent2 = new InitializedComponent();
        initializedComponent2.setInitializedString("Test Initialization 2 Successful");

        NullComponent nullComponent1 = null;
        NullComponent nullComponent2 = null;

        NullContainingComponent nulLContainingComponent1 = new NullContainingComponent();
        nulLContainingComponent1.setIntendedNullString(null);

        NullContainingComponent nullContainingComponent2 = new NullContainingComponent();
        nullContainingComponent2.setIntendedNullString(null);

        System.out.println(initializedComponent1.getInitializedString());
        System.out.println(initializedComponent2.getInitializedString());
        System.out.println(nullComponent1);
        System.out.println(nullComponent2);
        System.out.println(nulLContainingComponent1.getIntendedNullString());
        System.out.println(nullContainingComponent2.getIntendedNullString());

        Composite composite = new Composite();
        composite.addInitializedComponents(initializedComponent1);
        composite.addInitializedComponents(initializedComponent2);
        composite.addNullComponent(nullComponent1);
        composite.addNullComponent(nullComponent2);
        composite.addNullContainingComponent(nulLContainingComponent1);
        composite.addNullContainingComponent(nullContainingComponent2);
    }
}

这是复合对象。组件对象是带有访问器的简单包装器。

package com.greathouse.aggregationtest.types;

import java.util.List;

public class Composite {
    private List<InitializedComponent> initializedComponents;
    private List<NullComponent> nullcomponents;
    private List<NullContainingComponent> nullContainingComponents;
    /**
     * @return the initializedComponents
     */
    public List<InitializedComponent> getInitializedComponents() {
        return initializedComponents;
    }
    /**
     * @return the nullComponents
     */
    public List<NullComponent> getNullcomponents() {
        return nullcomponents;
    }
    /**
     * @return the nullContainingComponents
     */
    public List<NullContainingComponent> getNullContainingComponents() {
        return nullContainingComponents;
    }
    public void addInitializedComponents(InitializedComponent initializedComponent) {
    this.initializedComponents.add(initializedComponent);
    }
    public void addNullComponent(NullComponent nullcomponent) {
    this.nullcomponents.add(nullcomponent);
    }
    public void addNullContainingComponent(NullContainingComponent nullContainingComponent) {
    this.nullContainingComponents.add(nullContainingComponent);
    }
}

控制台输出。

Testing aggregation
Test Initialization 1 Successful
Test Initialization 2 Successful
null
null
null
null
Exception in thread "main" java.lang.NullPointerException
at com.greathouse.aggregationtest.types.Composite.addInitializedComponents(Composite.java:28)
at com.greathouse.aggregationtest.App.main(App.java:41)

【问题讨论】:

  • 在哪一行抛出空引用异常?
  • 还有stacktrace?,你在哪里初始化Composite中的属性?
  • 查看右侧的相关问题。 NullPointerExceptions 并不是完全不常见的问题。请搜索阅读。
  • 我同意其他人的观点。看来您没有做功课...此外,如果堆栈跟踪中有行号-请告诉我们它指向的位置!例如。做一个像// &lt;-- NPE thrown here (Line 28)这样的代码注释。
  • 我搜索了,我找到的其他人都没有解决集合。此外,我觉得错误“..addInitializedComponents..”很好地表明了错误的来源。与其说反对,不如你帮忙。就像那些真正回答了这个问题的人一样。

标签: java collections nullpointerexception


【解决方案1】:
  private List<InitializedComponent> initializedComponents;
  private List<NullComponent> nullcomponents;
  private List<NullContainingComponent> nullContainingComponents;

此属性未初始化

您创建了Composite 的实例,但您从未定义构造函数来初始化这些属性...

你可以在 Composite 中试试这个:

public Composite()
{
     this.initializedComponents = new ArrayList<InitializedComponent>();
     this.nullcomponents = new ArrayList<NullComponent>();
     this.nullContainingComponents = new ArrayList<NullContainingComponent>();
}

【讨论】:

  • 另外,List 可能支持也可能不支持空值。 List nullcomponents 作为 ArrayList 将支持。
【解决方案2】:

您的InitializedComponentList 未初始化。 :)

private List<InitializedComponent> initializedComponents =
                                   new ArrayList<InitializedComponent>();

您的NullComponent 的列表也是NULL。在尝试向它们添加元素之前,您需要实例化所有成员字段 Lists。

private List<NullComponent> nullcomponents =
                            new ArrayList<NullComponent>();
private List<NullContainingComponent> nullContainingComponents =
                                      new ArrayList<NullContainingComponent>();

【讨论】:

    猜你喜欢
    • 2017-02-20
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2015-04-23
    • 2019-08-09
    相关资源
    最近更新 更多