Странная проблема с возвратом в блоке catch в Java - PullRequest
1 голос
/ 23 июня 2011

У меня странная проблема с блоком try / catch, который я использую. У меня есть этот метод, который просто получает некоторые данные из удаленного сервиса и сохраняет их.

public WFSGetCapabilitiesResponse wfsGetCapabilities(String url) {
    WFSGetCapabilitiesResponse response = new WFSGetCapabilitiesResponse();

    try {
        WFSDataStore data = loadWFSCapabilities(url);
        String[] typeNames = data.getTypeNames();
        ArrayList<WFSFeatureTypeBase> wfsLayers = new ArrayList<WFSFeatureTypeBase>();
        for (int i = 0; i < typeNames.length; i++) {
            String typeName = typeNames[i];

            WFSFeatureTypeBase newLayer = new WFSFeatureTypeBase();
            newLayer.setTypeName(typeName);
            newLayer.setName(typeName.split(":")[1]);
            newLayer.setTitle(data.getFeatureTypeTitle(typeName));
            newLayer.setAbstract(data.getFeatureTypeAbstract(typeName));
            newLayer.setServiceUrl(url.split("\\?")[0]);

            wfsLayers.add(newLayer);
        }
        response.setWFSLayers(wfsLayers);
    } catch (IOException e) {
        response.setError(WCSCapabilitiesResponse.IO_EXCEPTION);
        response.setErrorMessage(e.getMessage());
        response.setSuccessful(false);
        e.printStackTrace();
        return response;
    }
    return response;
}

Если я запускаю с этим кодом, я получаю исключение нулевого указателя ('data' равно null, но на самом деле не знаю, актуально ли это). Однако, если я удаляю оператор return из моего блока catch, все в порядке.

Странно то, что IOException не обнаруживается ни в одном случае, поэтому я не могу понять, почему это оказывает такое влияние.

Итак, опять же, с возвратом в блоке catch это не работает, без него это работает ... Я действительно не понимаю, почему это произойдет.

Есть идеи?

1 Ответ

0 голосов
/ 23 июня 2011

Что ж, моя первая мысль: блок catch может только иметь значение, если выбрасывается IOException - поэтому мы точно знаем, что это происходит. И также мы знаем, что без блока catch это исключение будет распространяться из метода wfsGetCapabilities (возможно, вы добавили соответствующее объявление throws при удалении блока catch).

Таким образом, есть вероятность, что в «рабочем» случае вызывающий код перехватывает IOException и обрабатывает его таким образом, что ваш метод работает, судя по выводу. Конечно, ваш метод не работает и выдает исключение, но, возможно, есть запасной вариант по умолчанию (или аналогичный), который вызывается в случае ошибки?

Так что это "странная" часть, мы надеемся разобраться. Что касается «проблемной» части, если вы получаете NullPointerException с блоком catch, но не без него, ясно, что ваша логика блока catch не совсем верна и вызывает эту проблему. Из того, что вы опубликовали, не похоже, что какая-либо из этих непосредственных ссылок будет нулевой - посмотрите на трассировку стека и определите, из какой строки выдается исключение, затем исправьте его, как и любой другой NPE.

...