2017-04-13 2 views
0

null 포인터가 발생했습니다. 비교 방법에 익숙하지 않고 잘못된 위치를 파악하려고합니다. 아이디어는 내가 판매하는 제품의 수를 기준으로 정렬 한 다음 판매되는 상위 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; 
} 
+0

오류 로그를 게시 할 수 있습니까? –

+0

도 마찬가지입니다. -> Product.findAll (""); ? –

+0

당신의 비교에서 실수가 있습니다. else if는 -> else if (p1.getCopiesSold()

답변

1

findAll()을 확인하십시오. 일부 값의 값이 null 인 목록을 제공하는 것으로 보입니다. Collections이 사용하는 정렬 알고리즘에 의해 compare 메소드가 호출되면 p1 또는 p2가 null이기 때문에 p1.getCopiesSold 또는 p2.getCopiesSold이 오류를 발생시킵니다.

findAll()List이 아니고 null을 반환하거나 getCopiesSold 메서드가 null을 반환 할 수도 있습니다.

자바에서는 예외를 throw하지 않고 무언가를 null 값으로 가질 수 있습니다. 메서드를 호출하거나 조작을 수행하려고 시도 할 때만 예외가 발생합니다. 이 때문에 null 변수는 오류를 던진 행에서 사용되는 변수가 될 수 있습니다.

+0

고마워, getter에서이 문제를 해결했지만 나에게 상위 5 개 제품을 판매하지 못했습니다. 목록의 순서를 바꾸고 싶습니다. – Lee

+0

@OusmaneMahyDiaw 방금 문제를 업데이트했지만 List의 순서를 반대로하고 싶습니다. 역 API 호출을보고있었습니다. 비슷한가요? – Lee

+0

@ Collections.Reverse() 메소드를 사용하십시오 –