Скажем, у меня есть ComparatorFactory, у него есть много компараторов, составленных лямбдой:
public static Comparator<SomeClass> getXCmp() {
return (o1, o2) -> {
Double d1 = Double.parseDouble(o1.getX());
Double d2 = Double.parseDouble(o2.getX());
return d1.compareTo(d2);
};
}
Я использовал эти компараторы для сортировки и фильтрации данных.
К сожалению, я использовал неверный компаратор в каком-то месте, и это вызвало ClassCastException
, как показано:
java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.String
at businesslogic.utility.ComparatorFactory$$Lambda$24/115669291.compare(Unknown Source)
at javax.swing.DefaultRowSorter.compare(DefaultRowSorter.java:968)
...
...
Как вы можете видеть, это показывает (Unknown Source)
, из-за чего мне трудно найти, какой компаратор ошибочен. Я также попытался добавить точку останова до того, как произойдет сравнение (т.е. В верхнем примере, в DefaulRowSorter.java:968
), но next step
также не может определить, что это лямбда (он перескакивает на неверный компаратор, который не имеет ничего общего с double
и string
, и когда я, наконец, нашел ошибку, это было неверно).
После того, как я нашел ошибку (пытаясь понять весь проект и много времени), я попробовал анонимный класс. Ядро стека явно сообщило мне, где оно находится.
Q
Если я хочу, чтобы лямбда предоставила сжатый код, есть ли хороший способ найти, где находится источник лямбда или какая-либо хорошая практика, чтобы помочь мне, когда произойдет исключение?
A простой пример, чтобы повторно создать аналогичную проблему.