Java instanceof是否适用于子类异常?

Java instanceof是否适用于子类异常?,java,exception-handling,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

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");
   }
}

(作为记录,是的,我知道捕获普通异常是不好的,仅在本例中使用它;)

异常是常规类,因此
instanceof
对它们很有效

但你不需要这样的东西。以下操作可获得相同的结果:

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

是的,两者都可以。因为ConnectionException是SocketException,所以它也是它的一个实例。

Bozho已经给出了正确的答案。我不知道您的具体用例,但您更希望捕获不同的异常:

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

是的,这就是
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
}

我知道这是一种很好的方法,但如果您想在代码中的许多地方执行自定义操作,可以执行以下操作: 公共类ImageIOExecution扩展异常{

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;
    }

为什么不试试呢?(是的,你明白了)。如果你只是在这里试一下,所花的时间会比在这里问的时间要少……谁说这样问的每一个问题都是由坐在IDE旁边的人提出的?我的iPhone上没有开发环境……如果你需要在catch子句期间执行一些通用代码,但必须根据发生的异常抛出另一个特定异常,该怎么办那么instanceof是最干净的对吗?还是不同的catch子句?