Почему я получил сообщение о том, что ни одно исключение не выброшено? - PullRequest
1 голос
/ 27 мая 2011

У меня есть это в классе, который реализует 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
}

Но я получил ошибку и сообщение IDE о том, что SQLException никогда не выбрасывается. Это потому что я выполняю в ExecutorService?

ОБНОВЛЕНИЕ : Таким образом, отправка не выдает исключение 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 ]

2 голосов
/ 27 мая 2011

Когда вы звоните submit, вы передаете объект.Вы не звоните call().

РЕДАКТИРОВАТЬ

Submit возвращает Future f.Когда вы вызываете f.get(), метод может выдать ExecutionException , если возникла проблема во время выполнения вызываемого.Если это так, он будет содержать исключение, выданное 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

    } 

}
1 голос
/ 27 мая 2011

Метод submit не генерирует исключение SQLException.

0 голосов
/ 27 мая 2011

Какой IDE вы пользуетесь? Когда я пробую ваш код, Eclipse жалуется на «необработанное исключение типа исключения». Это имеет смысл, потому что интерфейс Callable определяет метод call() для выброса Exception. Только потому, что ваш класс реализации объявляет более ограниченный тип исключения, вызывающая программа не может рассчитывать на это. Ожидает, что вы поймаете исключение.

0 голосов
/ 27 мая 2011

Это потому, что SQLException никогда не будет выдан сканером.

Попробуйте использовать finally вместо catch и посмотрите, возникнет ли у вас проблема или она работает.

...