这是填充数组的对象的类
class InventoryItem implements Comparable<InventoryItem>{
String name;
double price = 0.0;
int quantity = 0;
int itemCount = 0;
public InventoryItem(String newName, double newPrice, int newQuantity){
name = newName;
price = newPrice;
quantity = newQuantity;
itemCount++;
}
public String toString(){
String output = name + ", at " + Program4.moneyString(price) + " each.";
output += " We have " + getQuantity() + " of them.\n";
return output;
}
public String getName(){
return name;
}
public int getQuantity(){
return quantity;
}
public double getPrice(){
return price;
}
public int compareTo(InventoryItem other){
return getName().compareTo(other.getName());
}
}
我打算对数组进行排序
public static void sortByName(InventoryItem[] array){
Arrays.sort(array);
}
这给了我错误
Exception in thread "main" java.lang.NullPointerException
at java.util.ComparableTimSort.binarySort(Unknown Source)
at java.util.ComparableTimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at CSC120Program4.Program4.sortByName(Program4.java:97)
at CSC120Program4.Program4.processUserChoice(Program4.java:121)
at CSC120Program4.Program4.main(Program4.java:134)
我没有足够的经验知道如何解决这个问题,或者说我做错了什么。
编辑:正在构建的数组:
static InventoryItem[] inventoryItems = new InventoryItem[100];
public static void readAndStoreInventory(InventoryItem[] items, Scanner input){
String[] params = new String[3];
while(input.hasNextLine()){
String name = "";
double value = 0.0;
int quantity = 0;
params = (input.nextLine().split("#"));
name = params[0];
value = Double.parseDouble(params[1]);
quantity = Integer.parseInt(params[2]);
items[lastInUse + 1] = new InventoryItem(name, value, quantity);
lastInUse++;
}
input.close();
正在读取的文件如下:
wooden baseball bat#3.67#10
rubber mallet#5.50#20
duffel bag#10.20#11
gold bar#9999.99#1
hitman rental#20000.00#99
minivan#15000.21#3
half full cup#2.00#10
half empty cup#10.00#10
lawn chair#12.34#100
used golf ball#0.99#2
cosby sweater#250.00#1
CSC120 cheatsheet#0.01#1
答案 0 :(得分:2)
您正在创建一个包含100个元素的数组,但您只创建了几个项目。 所以当你对它进行排序时,它也会对这些空对象进行排序。您应该为此目的使用List。
您还可以尝试添加null-ptr检查:
public int compareTo(InventoryItem other){
if (other != null){
return getName().compareTo(other.getName());
}
return 0
}
一个肮脏的修复方法是获取元素的大小并仅对添加的元素进行排序:(更好的方法是从头开始使用列表)
public static void sortByName(InventoryItem[] array){
int counter = 0;
for (int i = 0; i < array.length; i ++)
if (array[i] != null){
counter ++;
break;
}
Arrays.sort(array, 0, counter-1);
}
答案 1 :(得分:0)
线程“main”中的异常java.lang.NullPointerException
可能意味着null
正在访问其中的属性。可能在这里:
public int compareTo(InventoryItem other){
return getName().compareTo(other.getName());
}
所以其中一个name
为空。所以可能在这里:
params = (input.nextLine().split("#"));
name = params[0];
答案 2 :(得分:0)
InventoryItem数组初始化为100,如果您没有读取100行,那么您将为不存在的索引提供空指针。你需要使用List而不是java数组。
List<InventoryItem> inventoryItems = new List<InventoryItem>();
然后当你添加它们时,做这样的事情,
inventoryItems.add(new InventoryItem(name, value, quantity));
答案 3 :(得分:0)
Arrays.sort(Object[])
期望数组中的所有元素都是!= null
,因为它需要
数组中的所有元素必须相互可比较(即e1.compareTo(e2)......
您看到的是null.compareTo(something)
的结果。
您的InventoryItem[] array
可能有100个插槽,但并非所有插槽都已填满。
要解决这个问题,你可以
Arrays.sort(Object[] array, int fromIndex, int toIndex)
(0, lastIndexUsed
作为参数)对填充的子集进行排序。Comparator
的{{1}}。使用其中一个算法不再是null
而是null.compareTo(something)
,这不会导致NPE。请参阅How to sort an array of objects containing null elements? comparator.compare(null, something)