Я хочу метод, который может вызывать любые Throwable, включая подкласс Exception. Ive получил что-то, что принимает исключение, заставляет его в потоке локально, а затем вызывает class.newInstance. Этот класс ctor объявляет, что он выбрасывает Exception, а затем принимает threadlocal и бросает его. Проблема в том, что это не работает для двух объявленных исключений, которые были выбраны Class.newInstance()
, а именно IllegalAccessException
и InstantiationException
.Магический метатор исключения без объявления бросков Исключение
Я предполагаю, что любой другой метод с использованием некоторого класса sun.*
- это просто взломать и не очень надежный.
Обертывание это не вариант, потому что это означает, что ловцы ловить тип различий, и это слишком простой и скучный ...
static public void impossibleThrow(final Throwable throwable) {
Null.not(throwable, "throwable");
if (throwable instanceof RuntimeException) {
throw (RuntimeException) throwable;
}
if (throwable instanceof Error) {
throw (Error) throwable;
}
try {
THROW.set((Exception) throwable);
THROWER.newInstance();
} catch (final InstantiationException screwed) {
throw new Error(screwed);
} catch (final IllegalAccessException screwed) {
throw new Error(screwed);
} finally {
THROW.remove();
}
}
private final static Class<Impossible> THROWER = Impossible.class;
private final static ThreadLocal<Exception> THROW = new ThreadLocal<Exception>();
static private class Impossible {
@SuppressWarnings("unused")
public Impossible() throws Exception {
throw THROW.get();
}
}
Я не могу получить то, что вы пытаетесь добиться .. – Bozho
Я не могу себе представить, почему это может быть полезно. – duffymo
Я думаю, что это просто для удовольствия. Как вы можете выбросить проверенное исключение, не объявив его в кавычки? –