java – 列出所有未报告的异常(包括声明异常的超类的异常)
作者:互联网
请考虑以下情形
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();
}
}
使用上面的代码,编译器将警告不要捕获(或不声明为throws)
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声明为抛出A而不是将其声明为抛出B,A会发生什么.有没有办法要求编译器检测到这一点并警告我.
再说一次,我并不是说编译器做错了,不要警告我反对.我要问的是,是否有办法让编译器按我的意愿行事.还是报告这个的工具?
解决方法:
这是编译器特定的行为.在Eclipse中使用场景时,编译器会告诉错误列表中的两个异常,尽管工具提示中只显示了一个.更有趣的是,当使用自动修复时,要么添加catch子句或throws声明,Eclipse将始终添加两者(换句话说:所有异常),忽略异常之间的任何子类关系.声明的顺序对此行为没有影响.所以也许你只想使用Eclipse:^).
标签:java,exception,static-analysis,throws 来源: https://codeday.me/bug/20190624/1282304.html