[英]Debugger says I'm getting a null pointer exception. Why?
我正在編寫一個簡單的程序,以特定方式對對象進行排序。 但是,運行時在之后停止
hardware[i].setItemID(itemID[i]);
如eclipse的調試器所示。 這是完整的代碼:
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];
這樣,您初始化了一個包含6個引用的數組,所有引用仍然為null
您需要初始化每個元素,例如
hardware[i] = new Item();
在訪問它之前
在Item[] hardware = new Item[6];
每個Item
為null
Item[] hardware = new Item[6];
這就是為什么您要獲得NPE。
在訪問之前,使用新的Item
對象初始化每個數組元素。
您為數組Item []保留了內存,但沒有為其中的每個元素保留內存。
初始化數組( Item[] hardware = new Item[6];
)只會創建一個具有null
s的指定大小的數組。 如果要在這些項目上設置屬性,則必須首先對其進行初始化:
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]);
}
hardware[]
中的所有元素都初始化為null。 您將需要將對象的引用存儲在案例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.