0

主な実装が 1 つだけの 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、例外は実装によってスローされなくなりましたが、インターフェイスをクリーンアップするのを忘れていたため、キャッチが役に立たなくなったことに気付きませんでした。

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 またはソース コード分析ツールを使用して、宣言されているが決してスローされない例外を検出する方法はありますか?

4

1 に答える 1

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

???

于 2013-10-15T14:51:52.687 に答える