问题描述
|
我使用的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 \'为空,但并不真正知道它是否相关)。但是,如果我从catch块中删除return语句,一切都很好。
奇怪的是,无论哪种情况都不会捕获IOException,所以我看不到为什么它会产生这种影响。
再说一次,使用catch块中的return不能正常工作,没有它就可以了...我真的不明白为什么会发生这种情况。
有任何想法吗?
解决方法
好吧,我首先想到的是,仅当抛出
IOException
时the1ѭ块才会产生变化-因此我们可以肯定地知道这种情况正在发生。同样,我们知道,没有catch块,此异常将传播到wfsGetCapabilities
方法之外(大概是在删除catch块时添加了适当的throws
声明)。
因此,在“正在工作”的情况下,调用代码很有可能将IOException捕获到更高的级别并以某种方式处理它,从而使您的方法似乎可以根据输出判断。当然,您的方法无效,并引发了异常,但也许在错误情况下会调用默认的后备(或类似方法)?
因此,这是“奇怪的”部分,有望解决。至于“问题”部分,如果您用catch块抛出了5英镑,但不是没有,则很明显,您的catch块逻辑并不正确,并导致了此问题。从您发布的内容来看,这些直接引用看起来都不为空-查看堆栈跟踪并确定从哪一行引发异常,然后像处理其他NPE一样对其进行修复。