0

私はJsonを解析するためにGsonを使用しています。Runtime Exceptionをキャッチしないと、戻り値の型がどうなるかわかりません。と期待していたのですが、簡単な文で評価するとnullそうではありません。nullif

私のコードは次のようになります。

public X x(final String jsonString) {
   return gson.fromJson(jsonString, X.class);
}

次に、別の関数から関数を呼び出します。

public void y() {
  final X x = x();
  if (x == null) {
    System.out.println("x == null");
  }
}

x が null であることを期待していましたが、print ステートメントが呼び出されていないためではありませんか? の値はx? x()関数でcatchブロックを使用し、catchブロック内から戻ることで問題を解決しましたnull。しかし、私は関数の値が何であるか疑問に思っていますx()(もしあれば?)? うまくいけば、私はまったく意味があります。

4

1 に答える 1

3

x()が例外をスローしている場合x、制御フローが中断されたため、変数は初期化されていません。try/catch がなければ、例外はスタックを上げ続け、x決して使用できません。try/catchxはブロック内のみ有効なため、例外が発生すると使用できなくなります。

次のようなことをしようとすると:

X x;
try {
    x = x();
} catch(RuntimeException e) {}
if (x == null) {
    ...

制御フローは割り当てをバイパスできるため、「変数 x が初期化されていない可能性があります」というエラーが表示されます。

于 2010-04-14T04:29:28.567 に答える