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子句?