我的for循环中的空指针异常

Null Pointer Exception in my for loop

在我的代码中有一个 'Null Pointer Exception' 但我似乎不明白为什么。我已将对象添加到构造函数中的 ArrayList 中。当我尝试 运行 方法时,出现空指针异常。任何帮助将不胜感激。

私有ArrayList产品;

//PRODUCTS CLASS CONSTRUCTOR

Products(){ 


    ArrayList<ProductsClass> products = new ArrayList<ProductsClass>(); //Declaration and instantiation of ArrayList

    products.add(new ProductsClass("Bread", 0.65));
    products.add(new ProductsClass("Milk", 2.00));
    products.add(new ProductsClass("Pasta", 3.35));
    products.add(new ProductsClass("Milk chocolate bar", 0.75));
    products.add(new ProductsClass("Dark Rum", 25.00));

    ProductsClass p = products.get(3);
    System.out.print(p.getItemName() + ""); //Testing to see if works#
    System.out.print("");
    System.out.print(" " + p.getItemPrice());

}

public void findMatchingItem() {

    for (ProductsClass product : products) {

    System.out.print(product);

    }
}

您需要在构造函数之外声明产品 ArrayList 以使其成为实例变量。

private ArrayList<ProductsClass> products

Products(){ 


    products = new ArrayList<ProductsClass>(); //Declaration and instantiation of ArrayList

    products.add(new ProductsClass("Bread", 0.65));
    products.add(new ProductsClass("Milk", 2.00));
    products.add(new ProductsClass("Pasta", 3.35));
    products.add(new ProductsClass("Milk chocolate bar", 0.75));
    products.add(new ProductsClass("Dark Rum", 25.00));

    ProductsClass p = products.get(3);
    System.out.print(p.getItemName() + ""); //Testing to see if works#
    System.out.print("");
    System.out.print(" " + p.getItemPrice());

}

您在构造函数中定义了 ArrayList。但是你正在访问一个方法。在此方法内部访问不是全局的。将其作为全局变量移动

ArrayList<ProductsClass> products;

Products(){ 


    products = new ArrayList<ProductsClass>(); //Declaration and instantiation of ArrayList

    products.add(new ProductsClass("Bread", 0.65));
    products.add(new ProductsClass("Milk", 2.00));
    products.add(new ProductsClass("Pasta", 3.35));
    products.add(new ProductsClass("Milk chocolate bar", 0.75));
    products.add(new ProductsClass("Dark Rum", 25.00));

    ProductsClass p = products.get(3);
    System.out.print(p.getItemName() + ""); //Testing to see if works#
    System.out.print("");
    System.out.print(" " + p.getItemPrice());

}

public void findMatchingItem() {

    for (ProductsClass product : products) {

    System.out.print(product);

    }
}

Products(){ 


ArrayList<ProductsClass> products = new ArrayList<ProductsClass>();     

...

}

您正在构造函数中创建一个 ArrayList。 这意味着,产品仅在构造函数中有效 -> 范围是一个函数,因此它在函数之外不可用

在构造函数之外定义数组列表。

任一:

ArrayList<ProductsClass> products = new ArrayList<ProductsClass>();

Products() {
    ... //rest here
}

ArrayList<ProductsClass> products;

Products() {
    products = new ArrayList<ProductsClass>();
    ... //rest here
}

您通常还应该为构造函数设置可见性。 又名:

public Products() {
    ...
}

您的代码编译情况如何?您是否在构造函数外部声明了成员变量 products 为:

    ArrayList<ProductsClass> products;

在 method/loop 内创建的任何引用 alive/can 只有在 method/loop 内才能访问。所以发生的事情是,即使产品对象被创建、初始化和赋值,这和成员变量产品是两个不同的东西。成员变量未初始化,抛出空指针异常

您需要将产品列表声明为成员变量。并在构造函数中初始化它。