Неинициализированная переменная внутри try / catch с необработанным исключением - PullRequest
1 голос
/ 17 апреля 2019

У меня есть переменная для инициализации, которая исходит из класса за исключением.

Поэтому, если я сделаю что-то вроде ConfigurationProvider reader = configurationReader.configurationProvider (), часть .configurationProvider () показывает красную линию, сообщающую, что исключение в IntelliJ не обрабатывается.

Поэтому я попытался поймать его внутри блока try / catch, как показано ниже:

    private String getConfigValue(ConfigurationProviderConfiguration configurationReader, String configName) {
        String value = null;
        ConfigurationProvider reader;
        try {
             reader = configurationReader.configurationProvider();
        } catch (Exception e){
            e.printStackTrace();
        }

        Properties config = reader.getConfiguration(configName); //Now, there is a red line under reader saying the variable might not have been initialized
        if (config == null) {
            LOGGER.warn("The configuration for " + configName + " cannot be found.");
        }else{
            value = config.getValue();
            if (value == null) {
                LOGGER.warn("The configuration for " + configName + " cannot be found.");
            }
        }
        return value;
    } 

Теперь, как вы можете видеть в комментарии, под читателем есть красная линия, говорящая о том, что переменная не инициализирована. Я понимаю, почему компилятор жалуется, так как он может пропустить попытку и перейти к блоку catch. Я попытался бы удалить блок catch, но я также не могу этого сделать, поскольку должен обработать исключение. Что я могу сделать в этом случае? Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Существует путь выполнения, где reader не инициализируется - если исключение выдается и перехватывается. Похоже, вам даже не следует пытаться использовать reader, если было выдано исключение при попытке его инициализации.

Только если исключение не было сгенерировано, вы должны использовать его и пытаться вернуть значение. Поместите весь код, следующий за блоком catch, в блок try после инициализации.

try {
    reader = configurationReader.configurationProvider();

    Properties config = reader.getConfiguration(configName);
    if (config == null) {
        LOGGER.warn("The configuration for " + configName + " cannot be found.");
    } else {
        value = config.getValue();
        if (value == null) {
            LOGGER.warn("The configuration for " + configName + " cannot be found.");
        }
    }
    return value;
} catch (Exception e){
    e.printStackTrace();
}

Теперь компилятор будет жаловаться, что не все пути возвращают значение, что верно в этом случае, когда выдается исключение. Либо повторно сгенерируйте исключение, либо верните что-нибудь, чтобы указать, что возвращаемое значение было недействительным. Повторное создание исключения также потребует предложения throws в вашем методе.

} catch (Exception e){
    e.printStackTrace();
    throw e;
    // OR
    return null;
}
1 голос
/ 17 апреля 2019

Переместите остальную часть вашего кода в тот же обработчик исключений:

private String getConfigValue(ConfigurationProviderConfiguration configurationReader, String configName) {
    String value = null;
    ConfigurationProvider reader;
    try {
        reader = configurationReader.configurationProvider();

        Properties config = reader.getConfiguration(configName);
        if (config == null) {
            LOGGER.warn("The configuration for " + configName + " cannot be found.");
        }else{
            value = config.getValue();
            if (value == null) {
                LOGGER.warn("The configuration for " + configName + " cannot be found.");
            }
        }
    } catch (Exception e){
        e.printStackTrace();
    }

    return value;
} 
...