Sorting with Comparator - Null Pointer Exception

Ardent Java Learner :

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)

Faiz Kidwai :

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.

edited at
0

Comments

0 comments
Login to comment

Related