我正在尝试编写一个接受房屋数组和价格,价格限制的方法。我希望该方法为价格低于或等于priceLimit的房屋返回一系列房屋。我想对数据进行传递以确定返回数组的大小。问题是我无法弄清楚如何将Houses对象从houses数组添加到lowPriceHouses数组。我得到的错误是:
Exception in thread "main" java.lang.NullPointerException at
prob3.HouseTester.getLowPriced(HouseTester.java:76) at
prob3.HouseTester.main(HouseTester.java:52)
代码
private static House[] getLowPriced(House[] houses, double priceLimit)
{
House[] lowPriceHouses = null;
int index = 0;
for (int i = 0; i <= houses.length; i++)
{
double prices = houses[i].getPrice();
if (prices <= priceLimit)
lowPriceHouses[index++] = houses[i];
}
return lowPriceHouses;
}
答案 0 :(得分:4)
错误是因为lowPriceHouses
是null
,您尚未对其进行初始化。您的循环也会出现问题,Java数组被0
索引。
所以,而不是
for (int i = 0; i <= houses.length; i++)
你应该使用......
for (int i = 0; i < houses.length; i++)
你遇到的问题是知道你会遇到多少元素。
现在,您可以使用System.arraycopy或只使用某种List
代替。
然后,您可以使用List#toArray
将列表转换回数组。
有关详细信息,请参阅Collections
更新了示例
private static House[] getLowPriced(House[] houses, double priceLimit)
{
List<House> lowPriceHouses = new ArrayList<House>(houses.length);
for (int i = 0; i <= houses.length; i++)
{
double prices = houses[i].getPrice();
if (prices <= priceLimit)
lowPriceHouses.add(houses[i]);
}
return lowPriceHouses.toArray(new House[lowPriceHouses.size()]);
}
答案 1 :(得分:1)
您需要在写入数组之前创建数组。
House[] lowPriceHouses = null;
应该是
House[] lowPriceHouses = new House[houses.length];
你真的想要一个更小的阵列,因为你可能不需要所有房屋..
将其设为ArrayList
然后在返回之前将其转换为toArray
会更容易。
for (int i = 0; i <= houses.length; i++)
您只想<
这是因为当你有一个大小为10的数组时,元素的索引是从0到9.因此访问元素arr[10]
会导致问题。
答案 2 :(得分:0)
你的lowPriceHouses是Null,所以你得到NullPointerException。请替换为以下代码
private static House[] getLowPriced(House[] houses, double priceLimit) {
List<House> lowPriceHouses = new ArrayList<House>()
int index = 0;
for (int i = 0; i <= houses.length; i++)
{
double prices = houses[i].getPrice();
if (prices <= priceLimit)
lowPriceHouses.add(houses[i]);
}
return lowPriceHouses.toArray(new House[lowPriceHouses.size()]);
}
答案 3 :(得分:0)
或者,如果您使用的是Java 8,则可以执行此操作:
public static House[] getLowPriced(final House[] houses, final double limit){
final List<House> list = Arrays.asList(houses).stream().filter(h -> h.getPrice() <= limit).sorted(Comparator.comparing(House::getPrice)).collect(Collectors.toList());
return list.toArray(new House[list.size()]);
}