清除在接口中声明但未由实现抛出的异常

时间:2013-10-15 14:43:35

标签: java exception interface

我有很多Java接口只有一个主要实现(不包括模拟和存根)。

随着时间的推移,接口及其实现也在不断发展,包括某些方法抛出的异常。

问题是当我们在实现中添加异常时,编译器会提醒我们在接口上添加异常。但是当实现不再抛出异常时,会有一个警告提醒我们删除实现中的异常声明,但是我们经常忘记将其从接口中删除。

因此,我们最终在接口的客户端代码中处理从未实际抛出的异常。

第1步,我们在实现中有一个例外,它在链上传播:

interface Service {
    void doSomething() throws MyException;
}
class ServiceImpl implements Service {
    void doSomething() throws MyException {
        if (dummyCondition) {
            throw new MyException("oops");
        }
        System.out.println("hello world");
    }
}
class Client {
    @Inject Service service;
    void clientCode() {
        try {
            service.doSomething();
        } catch(MyException e) {
            logger.error("oops", e);
        }
    }
}

步骤2,实现不再抛出异常,但是我们忘记清理接口了,所以不要意识到catch不再有用了:

interface Service {
    void doSomething() throws MyException;
}
class ServiceImpl implements Service {
    void doSomething() {
        if (dummyCondition) {
            logger.warning("actually, don't throw, just log 'oops'");
        }
        System.out.println("hello world");
    }
}
class Client {
    @Inject Service service;
    void clientCode() {
        try {
            service.doSomething();
        } catch(MyException e) {
            logger.error("oops", e); // we'll never get there.
        }
    }
}

理想情况下,我想在界面上发出警告,说“已声明异常但未被任何已知实现抛出”。

有没有办法在Eclipse中或使用源代码分析工具检测那些声明但从未抛出的异常,以便能够进行一些清理?

1 个答案:

答案 0 :(得分:-1)

你的意思是:

    Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {

        @Override
        public void uncaughtException(Thread arg0, Throwable arg1) {
            System.out.println("Thread "+arg0+" throwed uncaught exception:");
            arg1.printStackTrace();


            cleanupcode(); //clean up code
            savefiles(); //method to save files used by your app
            //You can create here a dialog with crash:
            JOptionPane.showMessageDialog(null, "Thread "+arg0+" throwed uncaught exception: "+arg1);
            System.exit(0);
        }});

???