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;
}

このコードを実行すると、null ポインター例外が発生します (「データ」は null ですが、関連性があるかどうかはわかりません)。ただし、catch ブロックから return ステートメントを削除すると、すべて問題ありません。

奇妙なことに、どちらの場合も IOException がキャッチされていないため、なぜこのような影響があるのか​​わかりません。

繰り返しますが、catch ブロックに return があると機能しません。それがないと機能しません...なぜこれが起こるのか、私には本当にわかりません。

何か案は?

4

1 に答える 1

0

ええと、私の最初の考えは、catchブロックがスローされた場合にのみ違いを生むことができるというIOExceptionことです-したがって、それが起こっていることは確かです。同様に、catch ブロックがないと、この例外がメソッドの外に伝播することがわかっていwfsGetCapabilitiesます (おそらくthrows、catch ブロックを削除したときに適切な宣言を追加したと思われます)。

そのため、「機能している」ケースでは、呼び出し元のコードが IOException を上位でキャッチし、出力から判断してメソッドが機能しているように見えるように処理している可能性があります。もちろん、あなたのメソッドは機能せず、例外がスローされましたが、おそらくエラーの場合に呼び出されるデフォルトのフォールバック (または同様のもの) がありますか?

それがうまくいけば対処される「奇妙な」部分です。「問題」の部分については、catch ブロックを使用してNullPointerExceptionスローされたが、それなしではスローされていない場合は、catch ブロックのロジックが正しくなく、この問題を引き起こしていることは明らかです。あなたが投稿したものから、これらの即時参照のいずれもnullになるようには見えません.スタックトレースを見て、例外がスローされた行を特定し、他のNPEと同じように修正してください.

于 2011-06-23T12:06:31.280 に答える