2

私は通常、ローカル変数をfinalとして宣言するのが好きですが、初期化中に例外を処理する必要がある場合、これを実行できないパターンが繰り返されます。

たとえば、私はこのコードを持っています:

final Client myClient = library.getClient("service");
//do a bunch of steps with myClient

しかし、私はそれを次のように頻繁に変更することになります:

Client myClient = null;
try {
    myClient = library.getClient("service");
} catch (someException ex) {
    // handle
    throw ex;
}
// do stuff with myClient

終わりに近づくにつれて少し読めなくなるので、すべての作業を行った後にキャッチを追加したくありません。それで、これを行うためのより良い方法はありますか?

4

6 に答える 6

3

try/catchを別のメソッドに入れることができます。

. . .
    final Client myClient = getClient();

private Client getClient() {
    try {
        return library.getClient("service");
    catch (someException ex) {
        // handle
        return null;
    }
}

を呼び出すメソッドで処理を続行しても意味がない場合getClient()、もう1つのオプションは、例外をスローしてtry/catchブロックを削除するように宣言することです。

于 2012-06-19T01:09:30.143 に答える
1

その特定のケースでは、空白のファイナルを使用できます:

final Client myClient;  // Note the lack of initialization here!
try {
    myClient = library.getClient("service");
} catch (someException ex) {
    // handle
    throw ex;
}
// do stuff with myClient

最終的に使用される可能性のある各コードパスで1回だけ初期化される限り、宣言時に最終変数を初期化する必要はありません。

これは、ブロックがメソッドを(または別catchの方法で)終了した場合にのみ機能します。他のフォールバック値をに割り当てることはできません。これは、ブロックにすでに割り当てられている可能性があり、単一初期化ルールに違反しているためです。returnthrowmyClienttry

空白のファイナルは、条件に応じてさまざまな方法で何かを初期化する場合にも役立ちます。

final Client myClient;
if (someCondition) {
    myClient = foo();
}
else {
    myClient = bar();
}
// do stuff with myClient
于 2012-06-19T01:41:34.103 に答える
1

コードをコンストラクターに入れます。

final Client myClient;

public MyClass() throws SomeException {
    myClient = library.getClient("service");
}
于 2012-06-19T01:11:52.957 に答える
0

もちろん、少なくとも2つの簡単なオプションがあります。

  • sでラップして、RuntimeExceptionいつ/処理するかを決定できます。
  • 適切にリファクタリングして、例外処理をメインラインコードの外に移動できます。

どちらにも長所と短所があります。

于 2012-06-19T01:09:22.527 に答える
0

コードのさまざまな部分をメソッドに分割し、myClientを最終変数として渡すことができます...また、1回の試行ですべてのコードを追加してcatchブロックを実行し、さまざまな例外をスローして処理することもできます。これは、例外部分の変数が必要ない場合にのみ可能です...グローバル変数も解決策になる可能性がありますが、良いものではありません...基本的な役割があります。コードが読めない場合は、メソッドとクラスに分割してください

于 2012-06-19T01:14:54.167 に答える
0

コードをラップする代わりにgetClient(他の場所で説明)、doStuffコードをラップすることができます。

try {
    doStuff( library.getClient("service") );
} catch (someException ex) {
    // handle
    throw ex;
}

public void doStuff(final Client myClient) {
    // do stuff
}

または、両方のアプローチを組み合わせることができます。

try {
    doStuff( getClient() );
} catch (someException ex) {
    // handle
    throw ex;
}
于 2012-06-19T01:15:55.593 に答える