简体   繁体   English

调试器说我收到一个空指针异常。 为什么?

[英]Debugger says I'm getting a null pointer exception. Why?

I'm writing a simple program that sorts objects by a specific way. 我正在编写一个简单的程序,以特定方式对对象进行排序。 However, runtime stops after 但是,运行时在之后停止

hardware[i].setItemID(itemID[i]); 

As indicated in eclipse's debugger. 如eclipse的调试器所示。 Here's the full code: 这是完整的代码:

public class TestItem
{
    public static void main(String [] args)
    {
        Item[] hardware = new Item[6];
        String[] itemID = {"1011", "1034", "1101", "1600", "1500", "1201"};
        String[] itemName = {"Air Filters", "Door Knobs", "Hammers", "Levels", "Ceiling Fans", "Wrench Sets"}; 
    int[] inStore = {200, 60, 90, 80, 100, 55};
    double[] price = {10.5, 21.5, 9.99, 19.99, 59, 80}; //80 dollars for a wrench set? Really? Shoulda gone to Sears... 
    for(int i = 0; i <= 5; i++)
    {
        hardware[i].setItemID(itemID[i]);
        hardware[i].setItemName(itemName[i]);
        hardware[i].setInStore(inStore[i]);
        hardware[i].setPrice(price[i]);
    }
    printInventory(hardware);
sortID(hardware);
sortInStore(hardware);
sortName(hardware);
sortPrice(hardware);

}
public static void printInventory(Item[] items)
{
for(int i = 0; i < items.length; i++)
 {
    System.out.println(items[i].toString());
 }
}
public static void sortName(Item[] items)
{
for(int i = 1; i < items.length; i++)
    {
    int j = i;
    int compareMeForWhile = items[i].getItemName().compareTo(items[i-1].getItemName());

    while(j>0 && compareMeForWhile == 1)
        {
        compareMeForWhile = items[i].getItemName().compareTo(items[i-1].getItemName());
        String temp1 = items[i].getItemName();
        String temp2 = items[i-1].getItemName();
        items[i].setItemName(temp2);
        items[i-1].setItemName(temp1);
        j--;
        }
    }
for(int i = 0; i < items.length-1; i++)
    System.out.println(items[i].toString());
}
public static void sortID(Item[] items)
{
for(int i = 1; i < items.length; i++)
    {
    int j = i;          
    while(j>0 && items[i].getItemID().compareTo(items[i-1].getItemID()) < 0)
        {

        String temp1 = items[i].getItemID();
        String temp2 = items[i-1].getItemID();
        items[i].setItemID(temp2);
        items[i-1].setItemID(temp1);
        j--;
        }
    }
for(int i = 0; i < items.length-1; i++)
    System.out.println(items[i].toString());
}
public static void sortInStore(Item[] items)
{
for(int i = 1; i < items.length; i++)
    {
    int j = i;          
    while(j>0 && items[i].getInStore() > items[i-1].getInStore())
        {

        int temp1 = items[i].getInStore();
        int temp2 = items[i-1].getInStore();
        items[i].setInStore(temp2);
        items[i-1].setInStore(temp1);
        j--;
        }
    }
    for(int i = 0; i < items.length-1; i++)
        System.out.println(items[i].toString());
}
public static void sortPrice(Item[] items)
{
for(int i = 1; i < items.length; i++)
    {
    int j = i;          
    while(j>0 && items[i].getPrice() > items[i-1].getPrice())
        {

        double temp1 = items[i].getPrice();
        double temp2 = items[i-1].getPrice();
        items[i].setPrice(temp2);
        items[i-1].setPrice(temp1);
        j--;
        }
    }
for(int i = 0; i < items.length-1; i++)
    System.out.println(items[i].toString());
}

//Sort ID, Name, In store, and price. Print results.



//for i ↠1 to length(A)
//j ↠i
//while j > 0 and A[j-1] > A[j]
//    swap A[j] and A[j-1]
//    j ↠j - 1
}
Item[] hardware = new Item[6];

by this you initialized an array with 6 references, all references are still null you need to initialize each element like 这样,您初始化了一个包含6个引用的数组,所有引用仍然为null您需要初始化每个元素,例如

hardware[i] = new Item();

before accessing it 在访问它之前

Every Item is null in Item[] hardware = new Item[6]; Item[] hardware = new Item[6];每个Itemnull Item[] hardware = new Item[6]; that's why you are getting NPE. 这就是为什么您要获得NPE。

Initialize each array element with new Item object before accessing. 在访问之前,使用新的Item对象初始化每个数组元素。

您为数组Item []保留了内存,但没有为其中的每个元素保留内存。

Initializing an array ( Item[] hardware = new Item[6]; ) just creates an array of the specified size with null s. 初始化数组( Item[] hardware = new Item[6]; )只会创建一个具有null s的指定大小的数组。 If you with to set properties on these items, you must first initialize them: 如果要在这些项目上设置属性,则必须首先对其进行初始化:

for(int i = 0; i <= 5; i++)
{
    hardware[i] = new Item(); // Missing from your snippet
    hardware[i].setItemID(itemID[i]);
    hardware[i].setItemName(itemName[i]);
    hardware[i].setInStore(inStore[i]);
    hardware[i].setPrice(price[i]);
}

All the element in hardware[] are initialize to null. hardware[]中的所有元素都初始化为null。 You will need to store the reference of an object in your case Item() and then use the setter method. 您将需要将对象的引用存储在案例Item()中,然后使用setter方法。

   for(int i = 0; i <= 5; i++)
    {
        hardware[i]=new Item();
        hardware[i].setItemID(itemID[i]);
        hardware[i].setItemName(itemName[i]);
        hardware[i].setInStore(inStore[i]);
        hardware[i].setPrice(price[i]);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM