Вы не можете не зафиксировать высоту StackPanel
. Он предназначен для неограниченного роста в одном направлении. Я бы посоветовал использовать другой Panel
. Зачем вам «нужен» внешний StackPanel
?
Почему вы хотите избежать getCause
. Конечно, вы можете написать себе метод для выполнения задачи, например:
public static boolean isCause(
Class<? extends Throwable> expected,
Throwable exc
) {
return expected.isInstance(exc) || (
exc != null && isCause(expected, exc.getCause())
);
}
Я не думаю, что у Вас есть любой выбор, но звонить через слои getCause. Если Вы смотрите на исходный код для Spring NestedRuntimeException, который Вы упоминаете, именно так он реализован.
Имитация является самой искренней формой лести. На основе быстрого контроля источника , это точно, что делает NestedRuntimeException:
/**
* Check whether this exception contains an exception of the given type:
* either it is of the given class itself or it contains a nested cause
* of the given type.
* @param exType the exception type to look for
* @return whether there is a nested exception of the specified type
*/
public boolean contains(Class exType) {
if (exType == null) {
return false;
}
if (exType.isInstance(this)) {
return true;
}
Throwable cause = getCause();
if (cause == this) {
return false;
}
if (cause instanceof NestedRuntimeException) {
return ((NestedRuntimeException) cause).contains(exType);
}
else {
while (cause != null) {
if (exType.isInstance(cause)) {
return true;
}
if (cause.getCause() == cause) {
break;
}
cause = cause.getCause();
}
return false;
}
}
ПРОТЕСТ : Вышеупомянутое является кодом с 4 марта 2009 так, если Вы действительно хотите знать то, что Spring делает прямо сейчас, необходимо исследовать код, поскольку это существует сегодня (каждый раз, когда это).
Ну, я думаю, что нет способа сделать это без звонка getCause()
. Если вы думаете, что это уродливо реализует класс утилиты для этого:
public class ExceptionUtils {
public static boolean wasCausedBy(Throwable e, Class<? extends Throwable>) {
// call getCause() until it returns null or finds the exception
}
}
На основании ответа Патрика Бооса: Если вы используете Apache Commons Lang 3, вы можете проверить:
indexOfThrowable : Возвращает (основанный на нуле) индекс первого Throwable, соответствующего указанному классу. ( точно ) в цепочке исключений. Подклассы указанного класса не соответствуют
if (ExceptionUtils.indexOfThrowable(e, clazz) != -1) {
// your code
}
или
indexOfType : возвращает индекс (на основе нуля) первого Throwable, который соответствует указанному классу или подклассу в цепочке исключений. Подклассы указанного класса соответствуют
if (ExceptionUtils.indexOfType(e, clazz) != -1) {
// your code
}
Пример для нескольких типов с Java 8:
Class<? extends Throwable>[] classes = {...}
boolean match = Arrays.stream(classes)
.anyMatch(clazz -> ExceptionUtils.indexOfType(e, clazz) != -1);