Java 这怎么会是nullpointerexception?

Java 这怎么会是nullpointerexception?,java,arraylist,Java,Arraylist,我真的很困惑:我只是想把ArrayList中每个对象的名称添加到另一个ArrayList中 for (int i = 0; i < availableParts.size(); i++) { for (int j = 0; j < namesOfIngredients.size(); j++){ if (availableParts.get(i).getName() != namesOfParts.get(j)){ namesOfP

我真的很困惑:我只是想把
ArrayList
中每个对象的名称添加到另一个
ArrayList

for (int i = 0; i < availableParts.size(); i++) {
    for (int j = 0; j < namesOfIngredients.size(); j++){
         if (availableParts.get(i).getName() != namesOfParts.get(j)){
             namesOfParts.add(availableParts.get(i).getName());
         }
    }//middle if statement makes sure there are no repeats
}
for(int i=0;i
编辑:我意识到NamesofIngreents是空的。但是,我需要它以null开头——这就是我复制名称的方式。不能这样做吗?

确保

  • 两个列表
    availableParts
    NamesofIngreents
    都不是
    null
  • 正在添加元素的列表(
    nameofpart
    )已使用构造函数正确初始化(不是
    null
  • 这些列表中的所有元素都不是
    null
  • 请记住,字符串比较是用完成的。在两个字符串对象上检查相等(
    ==
    )仅当它们是同一实例时才会返回true


    作为一个旁注,您可以考虑使用以确定某个部件的名称是否在<代码> NAMESOFFECTON>代码>列表中。此外,可能是输入错误,但您应该在该相等性检查中检查at

    nameofparts.get(j)

    您试图查看循环本身中的部分名称,但在循环的定义中,您将看到部分名称的长度。其中一个是空的吗?我打赌其中一个是。

    可用部件。get(I)可能为null,因此getName()调用会导致NPE。

    我们不知道:我们看不到
    可用部件和
    部件的名称是如何初始化的

    但我们可以告诉你如何找到答案。添加如下打印语句:

    print "Before I try it"
    print availableParts.get(i)
    print namesOfParts(availableParts.get(i))
    print "done"
    

    当它是NPE时,您将确切地看到是谁做了这件事。

    您似乎在调用循环中的许多方法,而没有检查调用它的对象是否为NULL。这样做总是明智的(特别是,如果您不确定给定方法返回的对象的约定)

    因此,基本上,每当您执行类似于
    object.method()
    和/或
    object.method1().method2()
    的操作时,请确保
    object
    和/或
    object.method1()
    在对其返回值调用后续方法之前不为NULL

    此外,您还可以通过以下方式中断调用,以便更好地在确切位置调试和捕获NPE:

    Object returnObj = object.method1();
    Object anotherReturn = returnObj.method2();
    

    根据您的编辑-如何声明事件的名称

    应该是

    Object namesOfIngredients = new Object(); 
    
    不是


    哪一行有NPE?内部for循环(带j的那一行)。如果您想使用调试器的话,您可能会遇到很多其他问题。这是我一眼就能看到的东西。当您选中
    namesOfParts.get(j)
    时,您可能会得到一个
    indexOutOfBounds
    异常,因为您在第一次检查时没有在该列表中放入任何内容。您将获得大量重复项,因为每次您在namesOfParts列表中找到具有不同名称的项时,您都在添加另一个
    AvailableParts.get(i)
    实例。希望这能帮你在将来省去一些麻烦:谢谢。这其实是我的问题。很抱歉没有提到它是如何初始化的。
    Object namesOfIngredients;