try / catch中未初始化的变量,带有未处理的异常

问题描述 投票:1回答:2

我有一个初始化的变量来自一个有异常的类。

因此,如果我执行类似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;
    } 

现在您可以在评论中看到,读者下面有一条红线表示该变量未初始化。我理解为什么编译器抱怨,因为它可能会跳过try并转到catch块。我会尝试删除catch块,但我也不能这样做,因为我必须处理异常。在这种情况下我该怎么办?任何帮助将不胜感激。

java variables exception initialization try-catch
2个回答
1
投票

有一个执行路径,其中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
投票

将其余代码移动到同一个异常处理程序中:

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;
} 
© www.soinside.com 2019 - 2024. All rights reserved.