【发布时间】:2013-09-24 01:28:59
【问题描述】:
考虑以下场景
public class A extends Throwable {}
public class B extends A {}
public class C
{
public void f() throws A, B
{
// Some condition
throw new A();
// Some condition
throw new B();
}
void g()
{
f();
}
}
使用上面的代码,编译器会警告不捕获(或不声明为抛出)
C.java:17: unreported exception A; must be caught or declared to be thrown
f();
^
如果我通过将 g 更改为
来解决此问题void g() throws A
然后我不会再收到警告(B 会被 A 隐式捕获)
有没有办法让编译器报告所有未捕获的异常,包括基类的异常(比如这里的 B)。
一种方法是更改g() 并将其声明为
public void f() throws B, A
在这种情况下,编译器将首先报告 B,一旦我将 B 添加到 g 的 throw 规范中,它将报告 A。
但这很痛苦,因为
- 这是一个两步过程
- 我可能无法控制函数
f来更改它的投掷规格。
有没有更好的方法让编译器报告所有异常?
我并不是说编译器在这里做错了什么——我要问的是——“有没有办法让编译器报告所有异常?”。或者是否有一个工具可以帮助我自动获取这些信息。
函数f在不同情况下会抛出A&B。如果我是g 的作者,我不会意外压制调用g 可能会抛出B 的信息——如果我将g 声明为throws A 而不是将其声明为@987654334,就会发生这种情况@。有没有办法让编译器检测到这一点并警告我。
再次,我并不是说编译器没有警告我这样做是错误的。我要问的是是否有办法让编译器做我想做的事。或者报告这个的工具?
【问题讨论】:
-
编译器在这里没有做任何“警告”。它根据 Java 的定义语义给你一个编译错误。这些相同的语义表明您的其他示例是完全合法的,因此无需警告。
-
@EJP,我并不是说编译器没有做正确的事情。我在问如何让编译器做不同的事情。
-
@user93353 在第二种情况下,
throws B (extends A), A是多余的;正确的响应是捕获A,Java 系统不关心(也不能关心)您是否也更具体地捕获B。如果您正在捕获IOException,那么如果您也有某种方法可以有效地以不同方式处理EOFException,那么这对您有好处,但是期望编译器警告您IOException的每个最后一个子类是不明智的获得特殊待遇(或正在使用instanceof而不是catch语句处理)。 -
@chrylis - 我知道 Java 系统不在乎 - 我要问的是 - 有没有办法让它在乎?
-
如果 B 如此重要以至于应该明确处理,请不要从 A 派生它。
标签: java exception static-analysis throws