Пытаюсь подключиться к БД. Функция getConnection (по всплывающей подсказке узнал) вызывает исключение SQLException. Пытаясь обратиться к несуществующему хосту получаю java.net.SocketException(который не наследуется от SQLException!). После этого вставил обработчик этого исключения.
НО, обработать это исключение мне не удается поскольку компилятор ругается, что это исключение никогда не будет возбуждено. Что делать, как быть? Никто с похожим не сталкивался?
Здравствуйте, Аноним, Вы писали:
А>Вот кусок кода: А>...
А>Пытаюсь подключиться к БД. Функция getConnection (по всплывающей подсказке узнал) вызывает исключение SQLException. Пытаясь обратиться к несуществующему хосту получаю java.net.SocketException(который не наследуется от SQLException!). После этого вставил обработчик этого исключения.
Вываливаться тебе должен все равно SQLException, SocketException может быть у него причиной (getCause()). Конечно, компилятор можно обмануть и прокинуть checked exception без его декларирования, но не думаю, что это твой случай.
А>НО, обработать это исключение мне не удается поскольку компилятор ругается, что это исключение никогда не будет возбуждено. Что делать, как быть? Никто с похожим не сталкивался?
DZ>Конечно, компилятор можно обмануть и прокинуть checked exception без его декларирования, но не думаю, что это твой случай.
Поделитесь секретом, как?
Здравствуйте, LeonidV, Вы писали:
DZ>>Конечно, компилятор можно обмануть и прокинуть checked exception без его декларирования, но не думаю, что это твой случай. LV>Поделитесь секретом, как?
Checked unthrowable exception
java.net.SocketException
at Test.<init>(Test.java:5)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
at java.lang.Class.newInstance0(Class.java:350)
at java.lang.Class.newInstance(Class.java:303)
at Test.throwsUnthrowableCheckedException(Test.java:11)
at Test.main(Test.java:26)
Здравствуйте, Andrei N.Sobchuck, Вы писали:
DZ>>>Конечно, компилятор можно обмануть и прокинуть checked exception без его декларирования, но не думаю, что это твой случай. LV>>Поделитесь секретом, как?
ANS>
Здравствуйте, LeonidV, Вы писали:
DZ>>Конечно, компилятор можно обмануть и прокинуть checked exception без его декларирования, но не думаю, что это твой случай. LV>Поделитесь секретом, как?
Делается два класса.
class B
{
static void method(){};
}
class A
{
public static void main(String[] args)
{
B.method();
}
}
Компилируются. Потом класс B меняется на.
class B
{
static void method() throws SomeCheckedException
{
throw new SomeCheckedException();
}
}
И компилируется отдельно и независимо. В результате оба класса функционируют нормально. Но при этом Checked исключение никем не ловится.
Здравствуйте, Blazkowicz, Вы писали:
B>Это не совсем то. Эта такая фича метода Class.newInstance(), который перехватывает InvocationTargetException и прокидывает истинное исключение:
То то. В конечном итоге оно вылетело из метода, в котором не объявлено. А newInstance используется относительно часто.
Здравствуйте, LeonidV, Вы писали:
DZ>>Конечно, компилятор можно обмануть и прокинуть checked exception без его декларирования, но не думаю, что это твой случай. LV>Поделитесь секретом, как?
In JDK 1.2, Thread.stop, Thread.suspend, and a few other thread-related methods were deprecated because they are unsafe [ThreadStop]. The following method demonstrates one of the horrible things you could do with Thread.stop:
// Don't do this - circumvents exception checking!public static void sneakyThrow(Throwable t) {
Thread.currentThread().stop(t); // Deprecated!!
}
This nasty little method does exactly what the tHRow statement does, except that it bypasses all exception checking by the compiler. You can (sneakily) throw any exception, checked or otherwise, from any point in your code, and the compiler won't bat an eyelash.
Второй пример как раз с Class.newInstance();
Третий через дженерики:
class TigerThrower<T extends Throwable> {
public static void sneakyThrow(Throwable t) {
new TigerThrower<Error>().sneakyThrow2(t);
}
private void sneakyThrow2(Throwable t) throws T {
throw (T) t;
}
}