2012-06-19 27 views
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 

我不想添加抓我做的所有的東西后,因爲它接近尾聲變得有點難以理解。那麼有沒有更好的方法來做到這一點?

回答

3

你可以把try/catch語句在一個單獨的方法:

. . . 
    final Client myClient = getClient(); 

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

如果它沒有意義的處理在調用getClient()的方法繼續下去,那麼另一種選擇是把它聲明拋出異常並擺脫try/catch塊。

+0

我會傾向於讓這種方法'static',因爲它不要求訪問實例字段。 – Bohemian

+0

@Bohemian - 看起來'library'是一個實例字段,並且'handle'中的任何內容都可能需要訪問實例方法和/或字段。如果不是,那麼肯定,它可以是「靜態」。但是,基本思想是將創建「客戶端」所需的處理過程轉換爲單獨的方法(靜態或非靜態)。 –

0

當然,也有至少兩個微不足道的選擇:

  • 可以在RuntimeException S環繞,並決定當/如果你要處理它。
  • 您可以適當地重構並將異常處理移出主線代碼。

兩者都有優點和缺點。

1

將代碼放在構造函數:

final Client myClient; 

public MyClass() throws SomeException { 
    myClient = library.getClient("service"); 
} 
0

,你可以在拆分在myClient作爲最終的VAR方法和手你的代碼的不同部分......你還可以添加所有的代碼在一個嘗試一個catch塊並拋出並處理不同的異常。這只是可能的,如果你不需要異常部分的變量......全局變量也可能是一個解決方案,但不是一個好的......這是一個地面角色。如果你看不懂你的代碼,在方法和類

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; 
} 
1

對於特定的情況下,你可以使用一個blank final

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

當你聲明它時,你不必初始化一個final變量,只要它在每個代碼路徑上初始化一次就可以使用它。

僅當您catch塊(通過return或其他throw)終止該方法的工作原理 - 你不能其他一些後備的值賦給myClient,因爲它可能會在try塊已經被分配已經,違反單 - 初始化規則。

空白決賽也是在根據條件不同的方式初始化一些有用的東西:

final Client myClient; 
if (someCondition) { 
    myClient = foo(); 
} 
else { 
    myClient = bar(); 
} 
// do stuff with myClient 
相關問題