I am trying to sort CalculationModelDetails
in Asc
and if priceRange (getPriceRange() == null)
it is placed last of a sorted list ..
I encounter a null pointer exception here Comparator.comparing(CalculationModelDetail::getPriceRange, (s1, s2) -> s2.compareTo(s1));
when I run the test ..
Could you let me know what am I missing here ..
public class PriceList extends ArrayList<Price> {
public static int compare(Price p1, Price p2) {
return p1.getAmount().compareTo(p2.getAmount());
}
}
public class PriceRange {
private final Price minimum;
private final Price maximum;
public int compareTo(PriceRange that) {
Comparator<PriceRange> rangeComparator = Comparator
.comparing((PriceRange priceRange) -> priceRange.getMinimum(), (s1, s2) -> PriceList.compare(s1, s2))
.thenComparing((PriceRange priceRange) -> priceRange.getMaximum(), (s1, s2) -> PriceList.compare(s1, s2));
return rangeComparator.compare(this, that);
}
}
public class CalculationModelDetail {
private BigDecimal perCent;
private Price absolute;
private PriceRange priceRange;
...
}
public class CalculationModelDetailList extends ArrayList<CalculationModelDetail> {
public List<CalculationModelDetail> sort() {
Comparator<CalculationModelDetail> detailComparator
= Comparator.comparing(CalculationModelDetail::getPriceRange, (s1, s2) -> s2.compareTo(s1));
Comparator<CalculationModelDetail> detailComparator_nullLast = Comparator.nullsLast(detailComparator);
Collections.sort(this , detailComparator_nullLast);
return this;
}
}
@Test
public final void testSort() {
final CalculationModelDetailList list = new CalculationModelDetailList();
final CalculationModelDetail detail0 = new CalculationModelDetail();
list.add(detail0);
detail0.setPriceRange(null);
final CalculationModelDetail detail1 = new CalculationModelDetail();
list.add(detail1);
detail1.setPriceRange(new PriceRange(1, 9));
final CalculationModelDetail detail2 = new CalculationModelDetail();
list.add(detail2);
detail2.setPriceRange(new PriceRange(10, 19));
final CalculationModelDetail detail3 = new CalculationModelDetail();
list.add(detail3);
detail3.setPriceRange(new PriceRange(20, 29));
final CalculationModelDetail detail4 = new CalculationModelDetail();
list.add(detail4);
detail4.setPriceRange(null);
List<CalculationModelDetail> actual = list.sort();
}
java.lang.NullPointerException at com.acc.CalculationModelDetailList.lambda$sort$1(CalculationModelDetailList.java:48) at java.util.Comparator.lambda$comparing$ea9a8b3a$1(Comparator.java:436) at java.util.Comparators$NullComparator.compare(Comparators.java:83) at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
You are setting priceRange
as null in detail0
so while sorting when you are getting the priceRange
value, you are calling compareTo
method on a null reference. Hence the issue. You need to handle this null value in detailComparator
.
class CalculationModelDetailList extends ArrayList<CalculationModelDetail> {
public List<CalculationModelDetail> sort() {
Comparator<CalculationModelDetail> detailComparator = Comparator.comparing(
CalculationModelDetail::getPriceRange,
Comparator.nullsLast((s1, s2) -> s2.compareTo(s1)));
Comparator<CalculationModelDetail> detailComparator_nullLast = Comparator
.nullsLast(detailComparator);
Collections.sort(this, detailComparator_nullLast);
return this;
}
}
Collected from the Internet
Please contact [email protected] to delete if infringement.
Comments