以此为例:
public class TestClass {
public static void test() throws SSLHandshakeException {
throw new SSLHandshakeException("I'm a SSL Exception");
}
public static void main(String[] args) throws SSLHandshakeException {
try {
test ();
} catch (IOException ioe) {
System.out.println("I`m handling IO exception");
}
}
}
所以,我有我的测试方法,其中我只是抛出SSLHandshakeException
IOException
的子类型。
这个输出是"我正在处理IO异常"。
为什么会这样?我希望我的方法会抛出SSLHandshakeException
。是否有catch
比throws
更重要的规则?
我只是想避免使用
try {
test ();
} catch (SSLHandshakeException se) {
throw se;
} catch (IOException ioe) {
System.out.println("I`m handling IO exception");
}
因为我认为它不太可读
答案 0 :(得分:2)
是否存在捕获比抛出更重要的规则?
它们是两个完全不同的东西。 throws
关键字是方法签名的一部分,并且说'此方法可以抛出此异常,因此每个调用方都应该明确处理它。'
无论方法与否,该方法实际上都抛出异常与此无关。
至于catch
声明。 SSLHandshakeException 是 IOException,因此它会按预期捕获。
要获得您想要的行为,您可以写:
try {
test ();
} catch (SSLHandshakeException sslExc) {
throw sslExc;
} catch (IOException ioe) {
System.out.println("I`m handling IO exception that is not an SSLHandshakeException");
}
编辑:你说你发现这个可读性较差。但说实话,这只是最好的方式。如果它的行为方式与您提出的方式相比,您可能永远无法在可能同时抛出它的方法中捕获SSLHandshakeException?如果你想在某些条件下捕捉它而把它扔在别人身上怎么办?它只是太有限和不直观。
另一种选择是这样的;但在我看来,这个可读性更低:
try {
test ();
} catch (IOException ioe) {
if(ioe instanceof SSLHandshakeException)
throw ioe;
System.out.println("I`m handling IO exception that is not an SSLHandshakeException");
}
答案 1 :(得分:0)
这可能是因为您打印了自定义字符串而不是异常消息。试试这个:
public static void main(String[] args) throws SSLHandshakeException {
try {
test ();
} catch (IOException ioe) {
System.out.println("I`m handling IO exception");
System.out.println(ioe.getMessage());
}
}
答案 2 :(得分:0)
SSLHandshakeException
是javax.net.ssl.SSLException
的子类,是java.io.IOException
的子类。
所以这段代码:
public static void main(String[] args) throws SSLHandshakeException {
try {
test ();
} catch (IOException ioe) {
System.out.println("I`m handling IO exception");
}
}
将捕获和IOException,从而打印消息“我正在处理IO异常”。