2011-06-23 3 views
1

私が使用しているtry/catchブロックで奇妙な問題が発生しました。私はこのメソッドを持っています。これは、リモートサービスからデータを取得して保存するだけです。Javaの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ポインタ例外を取得します。しかし、私がキャッチブロックからreturnステートメントを削除しても問題ありません。

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

もう一度、キャッチブロックでのリターンでは、それが動作しないと動作しません。なぜこのようなことが起こるのかわかりません。

アイデア?

+0

どこからデータにアクセスしようとしていますか? (nullの場合) – RMT

+4

スタックトレースを表示します。 –

+0

"それは動作する"を定義します。これは、ある種のオブジェクトを返したこと、例外をログに記録しなかったこと、またはこのメソッドが完全に発生するビジネスケースがあることを意味する可能性があります。 –

答えて

0

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

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

これはうまくいけば「奇妙な」部分です。 「問題」の部分については、NullPointerExceptionがキャッチブロックにスローされているが、キャッチブロックなしではスローされていない場合は、キャッチブロックのロジックが正しくなく、この問題が発生していることは明らかです。あなたが投稿したものから、それらの即時参照がヌルであるようには見えません - スタックトレースを見て、例外がスローされた行を特定し、他のNPEと同様に修正してください。