这是一个EJB项目。我需要实现一个比较两个或更多对象的函数,我可以在单击“添加”或“删除”按钮后添加或删除一个对象。因此,我的想法是将对象存储在HashMap中,然后比较它们并采取最好的方法。但是当我运行我的方法时,HashMap为null。方法无法在其中添加对象。如何使HashMap运行。我的代码附在下面。
@Stateful
public class ComparePropertySessionBean implements ComparePropertySessionBeanRemote{
public HashMap<Integer, Double> map = new HashMap<Integer, Double>();
@Override
public int getBestPerRoom() {
Iterator<Integer> iterator = map.keySet().iterator();
int i = 0;
double ave = 10000000000.00;
if (iterator.hasNext()) {
Integer key = iterator.next();
if (map.get(key) < ave) {
i = key;
ave = map.get(key);
}
}
return i;
}
@Override
public void addCompareProperty(int propertyId, double price, int noofbedrooms) {
if (!map.containsKey(propertyId)) {
map.put(propertyId, price/noofbedrooms);
}
}
@Override
public void removeCompareProperty(int propertyId) {
if (map.containsKey(propertyId)) {
map.remove(propertyId);
}
}
}
答案 0 :(得分:0)
map
本身只能为null。 (这不太可能,但你原则上应该map
字段private
。
看到堆栈跟踪会很好,但我看到的一个大问题是getBestPerRoom()
中的逻辑错误:
如果地图至少有一个条目,则此方法有效,但如果它是空的,则返回0.如果您的代码尝试使用此作为propertyId
调用其他方法,则它们将获得null进入和(如果他们没有仔细检查)将获得NPE
为了避免这些问题,您需要正确处理没有条目的情况。
更一般地说,有更好的方法来构造这个代码--OO原则建议你应该使用Property
类来封装有关不同属性的所有信息。然后,您可以通过编写Comparator
(或者只是将它们存储在TreeSet中)按价格对它们进行排序
如果您正在编写EJB应用程序,这还允许您使用JPA轻松地将Properties
存储在数据库中。