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

时间:2015-03-02 16:25:07

标签: java loops for-loop nullpointerexception

在我的代码中有一个'空指针异常',但我似乎无法理解为什么。我已将对象添加到构造函数中的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);

    }
}

4 个答案:

答案 0 :(得分:1)

您需要在构造函数之外声明产品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());

}

答案 1 :(得分:1)

Products(){ 


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

...

}

你在构造函数中创建一个ArrayList。 这意味着,产品仅在构造函数的一侧有效 - &GT;范围是一个函数,因此它不能在函数之外使用

在构造函数之外定义arraylist。

或者:

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

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

ArrayList<ProductsClass> products;

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

您还应该正常地为构造函数提供可见性。 又名:

public Products() {
    ...
}

答案 2 :(得分:0)

您在构造函数中定义了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);

    }
}

答案 3 :(得分:0)

您的代码是如何编译的?您是否在构造函数之外声明了成员变量产品:

    ArrayList<ProductsClass> products;

在方法/循环内创建的任何引用都是活动的/只能在方法/循环内部访问。所以正在发生的事情是,即使创建了产品对象,也会初始化并赋值,这个和成员变量产品是两个不同的东西。成员变量未初始化,因此抛出空指针异常。

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