instanceof是否为子类异常工作?

时间:2010-11-11 11:50:18

标签: java exception-handling

java.net.ConnectException延伸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 个答案:

答案 0 :(得分:11)

例外是常规课程,因此instanceof可以正常使用。

但你不需要这样的东西。以下结果取得了相同的结果:

try {
    throw new ConnectException();
} catch (SocketException e) {
    System.out.println("You've caught a SocketException, OR a ConnectException");
}

答案 1 :(得分:3)

是的,它会满足两者的需求。因为ConnectionException是一个SocketException,它也是它的一个实例。

答案 2 :(得分:3)

Bozho已经给出了正确答案。我不知道你的特殊用例,但你宁愿捕获不同的例外:

try {
  ...
}
catch (SocketException ex) {
  System.out.println("You've caught a SocketException, OR a ConnectException");
}
catch (Exception ex) {
  ...
}

答案 3 :(得分:2)

我知道现在这是一个好方法但是如果你想在代码的很多地方做自定义动作,你可以这样做: 公共类ImageIOExecption扩展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;
    }

答案 4 :(得分:0)

是的,这就是instanceof的工作原理。对于异常,如果您关心不同的异常,则更常见的是使用类似的东西。它的工作原理是因为JVM将按顺序处理catch语句列表并执行第一个匹配的语句。

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

如果您不关心Connection和Socket Exception之间的区别

,请在下面
catch(SocketException e)
{
   //got a SocketException or a subclass e.g. ConnectionException
}
catch(Exception e)
{
   //got another type of exception
}