【问题标题】:Strange problem with return in catch block in JavaJava中catch块中返回的奇怪问题
【发布时间】:2023-12-16 09:33:01
【问题描述】:

我正在使用的 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;
}

如果我使用这段代码运行,我会得到一个空指针异常(“数据”为空,但不知道它是否相关)。但是,如果我从我的 catch 块中删除 return 语句,一切都很好。

奇怪的是,IOException 在这两种情况下都没有被捕获,所以我不明白为什么它会产生如此大的影响。

同样,在 catch 块中返回它不起作用,没有它它会......我真的不明白为什么会发生这种情况。

有什么想法吗?

【问题讨论】:

  • 您试图从哪里访问数据? (当它为空时)
  • Define "it works" .... 这可能意味着您返回了某种对象,您没有记录异常,或者您有一些此方法处理的业务案例发生完美。

标签: java exception return catch-block


【解决方案1】:

嗯,我的第一个想法是 catch只有在抛出 IOException 时会产生影响 - 所以我们肯定会发生这种情况。同样我们知道,如果没有 catch 块,此异常将传播到 wfsGetCapabilities 方法之外(假设您在删除 catch 块时添加了适当的 throws 声明)。

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

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

【讨论】: