我有一个初始化的变量来自一个有异常的类。
因此,如果我执行类似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块,但我也不能这样做,因为我必须处理异常。在这种情况下我该怎么办?任何帮助将不胜感激。
有一个执行路径,其中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;
}
将其余代码移动到同一个异常处理程序中:
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;
}