2012-07-12 35 views
-5

任何人都可以建議如何重新寫下面的Java代碼片段,如果有的話,爲什麼它會不合適,謝謝!這個java代碼片段可以重寫嗎?

try { 
    int i = 0; 
    while (true) 
     a[i++].func(); 
} catch(ArrayIndexOutOfBoundsException e) { 
} 
+6

Ist此作業? – RoToRa 2012-07-12 09:14:11

+1

你明白這是幹什麼的嗎?如果是這樣,你必須知道它爲什麼不合適...... – Betlista 2012-07-12 09:16:34

+2

這在[* Java Puzzlers *]的第42項中涵蓋(http://www.amazon.co.uk/Java-Puzzlers-Traps-Pitfalls-Corner/DP/032133678X /)。 – 2012-07-12 09:16:45

回答

8

使用for-each循環:

for(TypeOfArray item : a) { 
    item.func(); 
} 

或可替代簡單的for循環:

for(int i = 0; i < a.length; i++) { 
    a[i].func(); 
} 

生成的字節碼是或多或少相同的,但我發現的for-each循環更優雅。您的代碼是不合適的,因爲它:

  • 使用流量控制異常
  • 使用while(true)循環(如果有任何其他方式根本不使用它)
4

由於一個好的一般原則,你不應該使用例外進行流量控制。坦率地說,在陣列的末端跑起來就是一片空白。

嘗試使用 「foreach」 循環:

for (IHasFunc hasFunc : a) { 
    hasFunc.func(); 
} 
0

不要使用異常來結束循環。使用a.length來確定大小。

0

如果使用for循環這樣的:

for (YourObject obj : a) { 
    obj.func(); 
} 

那麼你避免索引變量的要求。

如前所述,例外情況不適合流量控制。創建和追蹤執行流程非常困難。