按对象字段排序列表

时间:2017-04-13 00:04:31

标签: java sorting

我得到一个空指针,不熟悉比较方法并试图弄清楚我哪里出错了。我的想法是根据销售的产品数量排序,然后获得销售的前5个产品。一旦我实现了比较方法,它就会返回一个NullPointer。

public Result index() {
    // Get list of all categories in ascending order
    String name = "Best Sellers";
    List<Category> categoriesList = Category.findAll();
    List<Product> productsList;
    Long cat = new Long("11");
    productsList = bestSellers();

    return ok(index.render(env, categoriesList, productsList, cat, "", getCurrentUser(), name));
}


public List<Product> bestSellers(){
    List<Product> temp = Product.findAll("");
    Collections.sort(temp, new Comparator<Product>() {
         @Override
         public int compare(Product p1, Product p2) {
             if(p1.getCopiesSold()>p2.getCopiesSold()){
                return 1;
             } else if(p1.getCopiesSold()<p2.getCopiesSold()){
                 return -1;
             }
             return 0;
         }
    });

    List<Product> bestSellers = new ArrayList<>();
    for(int i=0; i<5; i++){
        bestSellers.add(temp.get(i));
    }
    return bestSellers;
}

我的getter为一些尚未购买的商品返回null,所以我只需添加一个null检查,一切正常。

public Integer getCopiesSold() {
    if(copiesSold==null){
        copiesSold = 0;
    }
    return copiesSold;
}

1 个答案:

答案 0 :(得分:1)

检查您的方法findAll()。它似乎给出了一个列表,其中某些值的值为null。当Collections使用的排序算法调用比较方法时,p1.getCopiesSoldp2.getCopiesSold会出错,因为p1或p2为空。

方法findAll()也可能返回null而不是List,或者方法getCopiesSold返回null。

在java中,某些东西的值可以为null而不抛出异常,它只会在您尝试调用方法或使用它执行操作时抛出异常。因此,null变量可以是抛出错误的行所使用的任何变量。