1

私は Callable を実装するクラスにこれを持っています:

public class MasterCrawler implements Callable {
    public Object call() throws SQLException {
        resumeCrawling();
        return true;
    }
    //more code with methods that throws an SQLException
}

この Callable を実行する他のクラスでは、次のようになります。

MasterCrawler crawler = new MasterCrawler();
try{
    executorService.submit(crawler); //crawler is the class that implements Callable
}(catch SQLException){
    //do something here
}

しかし、エラーが発生し、SQLException が決してスローされないという IDE のメッセージが表示されました。これは、ExecutorService で実行しているためですか?

UPDATE : したがって、送信は SQLException をスローしません。Callable (スレッドとして実行) を実行して例外をキャッチするにはどうすればよいですか?

解決済み:

public class MasterCrawler implements Callable {
    @Override
    public Object call() throws Exception {
        try {
            resumeCrawling();
            return true;
        } catch (SQLException sqle) {
            return sqle;            
        }
     }
}


Future resC = es.submit(masterCrawler);
if (resC.get(5, TimeUnit.SECONDS) instanceof SQLException) {
    //do something here
}
4

4 に答える 4

2

を呼び出すとsubmit、オブジェクトが渡されます。を呼び出していませんcall()

編集

SubmitFuture fを返します。を呼び出すと、callable の実行中に問題が発生した場合、メソッドはExecutionExceptionf.get()をスローできます。その場合、 によってスローされた例外が含まれます。call()

Callable をエグゼキューターに送信することで、実際に (非同期で) 実行するように要求しています。これ以上のアクションは必要ありません。未来を取得して待つだけです。

ソリューションについて

ソリューションは機能しますが、Call の戻り値をハイジャックしているため、これはあまりきれいなコードではありません。次のようなことを試してください:

public class MasterCrawler implements Callable<Void> {

    @Override
    public Void call() throws SQLException {
        resumeCrawling();
        return null;
    }

    public void resumeCrawling() throws SQLException {
        // ... if there is a problem
        throw new SQLException();
    }    

}

public void doIt() {

    ExecutorService es = Executors.newCachedThreadPool();
    Future<Void> resC = es.submit(new MasterCrawler());

    try {

        resC.get(5, TimeUnit.SECONDS);
        // Success

    } catch ( ExecutionException ex ) {

        SQLException se = (SQLException) ex.getCause();
        // Do something with the exception

    } catch ( TimeoutException ex ) {

        // Execution timed-out

    } catch ( InterruptedException ex ) {

        // Execution was interrupted

    } 

}
于 2011-05-27T02:05:33.193 に答える
1

submit メソッドは SQLException をスローしません。

于 2011-05-27T02:04:39.517 に答える
0

これは、SQLException がクローラーによって決してスローされないためです。

finallyの代わりに使用してみcatchて、問題があるかどうか、または機能するかどうかを確認してください。

于 2011-05-27T02:05:01.773 に答える
0

どのIDEを使用していますか? あなたのコードを試してみると、Eclipse は「未処理の例外タイプの例外」と文句を言います。インターフェイスが throwCallableするメソッドを定義しているため、これは理にかなっています。実装クラスがより制限された例外タイプを宣言しているという理由だけで、呼び出しプログラムはそれを期待できません。例外をキャッチすることを期待しています。call()Exception

于 2011-05-27T02:10:58.357 に答える