2016-12-11 9 views
0

私はPlay Frameworkでアプリケーションを構築していますが、私の関数定義の1つに挑戦しています。これは実際にPlay Frameworkに関する質問ではありませんが、このエラーのためsbt compileが失敗するため、Playに適用されます。戻り値の例外の処理

だから私は私のクラスのいずれかでこの機能を持っている:私は、関数内で例外をキャッチすることを決めた

private JSONObject getJsonObject(String url) { 
    HttpResponse<JsonNode> response; 

    try { 
     response = Unirest.get(url).asJson(); 
    } catch (UnirestException e) { 
     Logger.error("Failed to GET data. Connection string was: " + url); 
     e.printStackTrace(); 
    } 
    return response.getBody().getObject(); 
} 

理由は、私は私の関数が例外をthrowしたくなかったということでした。そのため、このtry-catchは、この関数が呼び出される複数の場所で実行する必要があります。私はthrows UnirestExecptionを置くことでそれを避けることができますが、それは、クラスコンストラクタのすべての方法で、関数スタック全体に泡立ちます。

しかし、現在のコードで、私のIDEとsbt compileは両方を教えてください:

[error]: variable response might not have been initialized 

私はこのケースでは、このから抜け出すにはどうすればよいですか? class definitionが私にはあまりにも恐ろしく見えるので、私はnew HttpResponse()をするように見えません。私はもちろん別のことをすることができませんUnirest.get()それはそれ自身の例外をスローするので!

どうすればいいですか?

+1

とき 'あなたの関数が返すようにしたいん何UnirestException'が発生しますか? – Marvin

+0

@Marvin私はそれについて考えたこともありませんでした!受け入れられた答えに私のコメントを参照してください。 :-) – dotslash

答えて

1

例外がスローされた場合の対応は何でしょうか? response = Unirest.get(url).asJson();が例外をスローすると、応答オブジェクトは初期化されません。

あなたがキャッチされた例外をラップし、それが好きな再スローすることができ、次のいずれか

private JSONObject getJsonObject(String url) { 
    HttpResponse<JsonNode> response; 

    try { 
     response = Unirest.get(url).asJson(); 
    } catch (UnirestException e) { 
     Logger.error("Failed to GET data. Connection string was: " + url); 
     throw new RuntimeException(e); 
    } 
    return response.getBody().getObject(); 
} 

またはGETリクエストが失敗した場合、いくつかのデフォルト値を返します。

private JSONObject getJsonObject(String url) { 
    HttpResponse<JsonNode> response; 

    try { 
     response = Unirest.get(url).asJson(); 
    } catch (UnirestException e) { 
     Logger.error("Failed to GET data. Connection string was: " + url); 
     return null; 
    } 
    return response.getBody().getObject(); 
} 
+1

また、「null」はおそらく「デフォルト値」として使用するのが最良ではないことに注意してください。 – Jezor

+1

さらに、スタックトレースを 'System.out'で記録したくないのは、将来、Slf4jのような別のロガーに切り替えて、スタックトレースをまったく見つけられないことに驚いているからです。ロガーで例外をログに記録するか、ログに記録しないでください。 – Jezor

+1

エラーを記録するのに 'System.out'を使用していません。あなたはそれを何と言いますか?しかしそれを除けば、私はアドバイスを感謝します! :-) – dotslash