Java 清理接口中声明但未由实现引发的异常

Java 清理接口中声明但未由实现引发的异常,java,exception,interface,Java,Exception,Interface,我有很多Java接口,只有一个主实现(不包括mock和stub) 随着时间的推移,接口及其实现不断发展,包括某些方法引发的异常 问题是,当我们在实现中添加异常时,编译器会提醒我们在接口上添加异常。但是,当实现不再抛出异常时,会出现一条警告,提醒我们删除实现上的异常声明,但我们经常忘记将其从接口中删除 因此,我们最终在接口的客户机代码中处理从未实际抛出的异常 第1步,我们在实现中遇到了一个异常,它会向上传播: interface Service { void doSomething() t

我有很多Java接口,只有一个主实现(不包括mock和stub)

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

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

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

第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步,实现不再抛出异常,但我们忘记清理接口,因此没有意识到捕获不再有用:

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中或使用源代码分析工具,有没有一种方法可以检测那些已声明但从未抛出的异常,以便进行清理?

您的意思是:

    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);
        }});

??

当您执行将由外部客户端使用的API时,最好将所有异常声明为RuntimeException。您是否应该实现一个接口,而不是由于实现中的更改而更新接口?它不适用于外部客户端。这只是我项目的内部内容。我声明了一个接口,以便在不同时测试实现代码的情况下更容易地测试接口的客户机(它们是同一产品中的其他类)。我所说的异常是在接口中声明的,但不是由任何实现引发的。这是一个代码清理问题,不是在runtimeWrite示例中要处理的问题。我不明白