web-dev-qa-db-ja.com

Java:Try-Catch-Continue?

一連のステートメントができるとしましょう。

try {
  String a = getProperty("a");
  String b = getProperty("b");
  String c = getProperty("c");
} catch(Exception e) {

}

ここで、プロパティbが見つからず、関数が例外をスローしたとします。この場合、プロパティごとにtry-catchブロックを記述せずに、続行するか、bをnullに設定するにはどうすればよいですか?つまり、a、b、cは存在しますが、例外がスローされている間はまったく見つからない場合があります。

14
Legend

プロパティが見つからないときにnullを返すように関数を変更できないと仮定すると、特に取得可能なすべての値を取得したい場合は、すべてを独自のtrycatchブロックでラップすることになります。 (失敗した最初の値で操作全体をキャンセルするのとは対照的です。)

取得するこれらのプロパティがたくさんある場合は、使用するヘルパーメソッドを作成する方がクリーンな場合があります。

String getPropertySafely(String key) {
   try {
      return getProperty(key);
   } catch (Exception e) {
      return null;
   }
}
19
Xanatos

各ステートメントの周りにtry-catchを配置する必要があります。続行はありません(VBの_ON ERROR ... RESUME_ブロックにあるように)。の代わりに:

_String a = null;
try {
  a = getProperty("a");
} catch(Exception e) {
  ...
}
String b = null;
try {
  b = getProperty("b");
} catch(Exception e) {
  ...
}
String c = null;
try {
  c = getProperty("c");
} catch(Exception e) {
  ...
}
_

あなたは書くことができます:

_public String getPropertyNoException(String name) {
  try {
    return getProperty(name);
  } catch (Exception e) {
    return null;
  }
}
_

個人的には、getProperty()は、必要なこの余分な定型文すべてに対して例外をスローするのに適していないと思います。

8
cletus

毎回同じ関数を使用しているので、これをループに入れることができるかもしれません:

String[] abc = new String[3];
String[] param = {"a", "b", "c"};
for (int i = 0; i < 3; i++) {
    try {
      abc[i] = getProperty(param[i]);
    } catch(Exception e) {

    }
}

しかし、これはかなり不自然であり、多数のプロパティにのみ役立ちます。単純に3回のtry-catchを書く必要があると思います。

5

getPropertyを使用する予定がある場合は、それを行う簡単な方法がないため、それらの処理方法を再検討する必要があります。

finallyステートメントを利用できますが、それでもすべての呼び出しにtry-catchが必要です。

3
Jack