标签:java exception static-analysis throws
请考虑以下情形
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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。