1

我正在使用的 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 块中返回它不起作用,没有它它确实......我真的不明白为什么会发生这种情况。

有任何想法吗?

4

1 回答 1

0

好吧,我的第一个想法是,只有在抛出 an 时,catch方块才能有所作为——IOException所以我们肯定会发生这种情况。同样我们知道,如果没有 catch 块,这个异常会传播到方法之外(假设你在删除 catch 块时wfsGetCapabilities添加了适当的声明)。throws

因此,在“工作”的情况下,调用代码很可能会捕获更高的 IOException 并以这样一种方式处理它,即您的方法似乎可以根据输出判断。当然,您的方法不起作用,并引发了异常,但也许有一个在错误情况下调用的默认回退(或类似的)?

这就是希望处理的“奇怪”部分。至于“问题”部分,如果你被NullPointerExceptioncatch 块抛出,但不是没有它,很明显你的 catch 块逻辑不太正确并且导致了这个问题。从您发布的内容来看,这些直接引用中的任何一个都不会为空 - 查看堆栈跟踪并确定从哪一行引发异常,然后像处理任何其他 NPE 一样对其进行修复。

于 2011-06-23T12:06:31.280 回答