работает instanceof для подклассовых исключений? - PullRequest
4 голосов
/ 11 ноября 2010

java.net.ConnectException extends java.net.SocketException

Если я сделаю следующее, будет ли удовлетворять оба исключения?то есть, если я поймаю «родительское» исключение, используя instanceof, включает ли оно какие-либо подклассовые исключения?

catch (Exception e)
{
   if (e instanceof java.net.SocketException)
   {
      System.out.println("You've caught a SocketException, OR a ConnectException");
   }
}

(а для записи, да, я знаю, что ловить простые исключения - плохо, просто использовать этопример;))

Ответы [ 5 ]

11 голосов
/ 11 ноября 2010

Исключениями являются обычные классы, поэтому instanceof отлично с ними работает.

Но тебе не нужна такая вещь. Следующее достигает того же результата:

try {
    throw new ConnectException();
} catch (SocketException e) {
    System.out.println("You've caught a SocketException, OR a ConnectException");
}
3 голосов
/ 11 ноября 2010

Божо уже дал правильный ответ. Я не знаю вашего конкретного варианта использования, но вы бы предпочли другие исключения:

try {
  ...
}
catch (SocketException ex) {
  System.out.println("You've caught a SocketException, OR a ConnectException");
}
catch (Exception ex) {
  ...
}
3 голосов
/ 11 ноября 2010

Да, это будет обслуживать оба. Поскольку ConnectionException является SocketException, оно также является его экземпляром.

2 голосов
/ 05 августа 2013

Я знаю, что теперь это хороший способ, но если вы хотите выполнить пользовательское действие во многих местах кода, вы можете сделать что-то вроде этого: открытый класс ImageIOExecption extends Exception {

Exception ex;

public ImageIOExecption(Exception ex) {
    this.ex = ex;
    doCatch();
 }

private void doCatch() {
    System.err.println(ex.getClass());

    if (ex instanceof java.net.SocketTimeoutException) {
        System.out.println("You've caught a SocketTimeoutException, OR a ConnectException");
    }

    if (ex instanceof java.net.SocketException) {
        System.out.println("You've caught a SocketException, OR a ConnectException");
    }


}
}

 public BufferedImage getBufferedImage() {
        try {
            BufferedImage srcImage = ImageIO.read(is);
            is.close();
            return  srcImage;
        } catch (Exception ex) {
            new ImageIOExecption(ex);
        }
        return null;
    }
0 голосов
/ 11 ноября 2010

Да, так работает instanceof. Для исключений чаще используется что-то подобное, если вы заботитесь о различных исключениях. Это работает, потому что JVM обработает список операторов catch по порядку и выполнит первое, которое соответствует.

catch(ConnectException e)
{
    //got ConnectException  
}
catch(SocketException e)
{
    /got a SocketException
}
catch(Exception e)
{
   //got some other exception
}

или ниже, если вас не волнует разница между подключением и исключением гнезда

catch(SocketException e)
{
   //got a SocketException or a subclass e.g. ConnectionException
}
catch(Exception e)
{
   //got another type of exception
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...