编程语言
首页 > 编程语言> > java – 列出所有未报告的异常(包括声明异常的超类的异常)

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