Java常见疑难问题-异常7


27. catch捕获规则
捕获RuntimeException、Exception或Throwable的catch语句是合法,不管try块里是否抛
出了这三个。但如果try块没有抛出或不可能抛出检测性,则catch不能捕获这些
,如IOException异常:
public class Test {
public static void main(String[] args) {
try{
//…
}catch (Exception e) {

}catch (Throwable e) {

}

/* !! 出错
try{
//…
}catch (IOException e) {

}
*/
}
}
28. 重写时方法范围
重写或实现时不能扩大异常的范围,如果是多继承,则异常取所有父类方法异常的交集或不
抛出异常:
interface I1 {
void f() throws Exception;
}

interface I2 {
void f() throws IOException;
}

interface I3 extends I1, I2 {}

class Imp implements I3 {
// 不能通过,多继承时只能取父类方法异常交集,这样就不会扩大异常范围
// !! void f () throws Exception;
// void f();// 能通过
// 能通过,Exception与IOException的交集为IOException
public void f() throws IOException {
}
}
29. 静态与非静态final常量不能在catch块中初始化
静态与非静态块中如果抛出了异常,则一定要使用try-catch块来捕获。

public class Test {
static final int i;
static {
try {
i = f();
} catch (RuntimeException e) {
i = 1;
}
}

static int f() {
throw new RuntimeException();
}
}
上面的程序不能通过。表面上是可以的,因为i第一次初始化时可能抛出异常,所以抛
异常时可以在catch块中初始化,最终还是只初始化一次,这正是空final所要求的,但为什
么编译器不知道这些呢?

要确定一个程序是否不止一次地对一个空final进行赋值是很困难的问题。语言规范在这一
点上采用了保守的方式。

声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 智乐兔
转载请注明:转自《Java常见疑难问题-异常7
本文地址:https://www.zhiletu.com/archives-240.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微