2010-11-11 54 views
4

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

(和备案,是的,我知道追赶平原例外是坏的,只是使用它的这个例子;))

+3

为什么不只是试试它? (是的,你抓到)。 – Roman 2010-11-11 11:52:00

+1

这会花你更少的时间来试试它,而不是在这里问它... – 2010-11-11 11:57:29

+0

谁说SO上的每个问题都是由某个坐在IDE中的人问的?在我的iPhone上没有开发环境... – Jimmy 2010-11-11 12:09:24

回答

11

例外的是普通班,所以instanceof正常工作为他们。

但你不需要这样的事情。以下达到相同的结果:

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

如果您需要在catch子句中执行一些通用代码,但必须根据发现的异常抛出另一个特定异常,该怎么办?那么instanceof是最干净的吧? – pete 2016-01-13 02:16:56

+0

或不同的catch子句? – Bozho 2016-02-16 14:40:46

3

是的,它会迎合两者。因为ConnectionException是一个SocketException,它也是它的一个实例。

3

Bozho已经给出了正确的答案。我不知道您的特定用例,但你宁愿赶上不同的异常:

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

是的,那是多么instanceof作品。对于例外情况,如果您关心不同的例外情况,则更常见的是使用类似的东西。它的工作原理是JVM会按顺序处理catch语句列表并执行第一个匹配的语句。

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

或以下,如果你不关心连接和Socket异常的区别

catch(SocketException e) 
{ 
    //got a SocketException or a subclass e.g. ConnectionException 
} 
catch(Exception e) 
{ 
    //got another type of exception 
} 
2

我知道,它现在是一个很好的方式,但如果你想要做自定义操作在代码中的许多地方你可以这样做: public class ImageIOExecption扩展异常{

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