2014-03-02 81 views
0

我的問題是,我想從ArrayList「塊」返回一個對象。 我的代碼不能正常工作 - 錯誤說:This method must return a result of type block從Arraylist返回對象

public block getBlockUnderneath (int x, int y){ 
    for(int i = 0; i<blocks.size(); i++){ 
     if (blocks.get(i).x == x) { 
      return blocks.get(i); 
     } 
    } 
} 
+0

什麼是'blocks'?這是一個列表嗎? – assylias

+3

如果'blocks.size()'返回0會發生什麼? –

+2

如果列表中沒有任何塊匹配'x',您會發生什麼? (另外,我建議你學習增強for循環...) –

回答

2

你有兩個問題:

  1. 如果您blocks.size()==0方法返回什麼
  2. 如果沒有在blocks塊均爲block.x==x你的方法返回沒有。

在Java 必須返回它的值的方法是宣佈這樣做。

您的問題,最簡單的解決方法是return null在方法的末尾:

public block getBlockUnderneath (int x, int y){ 
    for(final block b : blocks){ 
     if (b.x == x) { 
      return b; 
     } 
    } 
    return null; 
} 

聲明本採用了增強的for循環,這是在Collections(或任何推薦的方式循環, implements Iterable<T>)。

如果項目不被發現更好的方法可能是拋出一個異常:

public block getBlockUnderneath (int x, int y){ 
    for(final block b : blocks){ 
     if (b.x == x) { 
      return b; 
     } 
    } 
    throw new NoSuchElementException(); 
} 

在您需要處理的代碼的角落情況下調用此方法無論是哪種情況。

P.S.請堅持Java naming conventions。班級應該在PascalCase - 所以你block班應該被稱爲Block

只是爲了好玩,在Java 8:

public block getBlockUnderneath(int x, int y) { 
    return blocks.stream().filter((b) -> b.x == x).findFirst().get(); 
} 
+0

因爲這是它在當前版本中由於時間限制而實現的方式 –

+0

@Vash我進行了一個快速實驗(我確定你錯了,但我想檢查),你錯了。 'findFirst'只會遍歷Stream,直到找到第一個匹配的元素--filter不會遍歷整個Stream。運行'(build 1.8.0-ea-b120'。 –

+0

你有權利。如果你使用forEach而不是filter和findFirst(),我的意見是有效的。 –

0

,你永遠無法循環。

如果在循環中有一個return語句,那麼編譯器不會真正保證循環將執行並且您將返回。爲了解決這個問題,你必須在循環之後使用return

或者更好,但有一個變量return,像這樣的:

block ret = null; 
for(block b : blocks) { 
    if(b.x == x) { // I'm going to go over this in a mo 
     ret = b; 
     break; 
    } 
} 
return ret; 
1

與方法的問題是存在在未進行恢復塊的情況。在這種情況下,當一個方法沒有被聲明爲void時,你必須聲明它的退出點。

您可以使用退出或拋出異常退出。如果無法找到請求的值,則選擇取決於程序應該執行的操作。

public block getBlockUnderneath (int x, int y){ 
    for(int i = 0; i<blocks.size(); i++){ 
     if (blocks.get(i).x == x) { 
      return blocks.get(i); 
     } 
    } 
    return null; //or throw NoSuchElementException or IllegalStateException 
} 

更重要的是,您可以使用for-each loop來改善您的代碼。這個解決方案可以爲您提供更好的性能,並且可以爲代碼提供安全性,因爲它使用迭代器,而不是按索引訪問項目,這不一定高效。

在這種情況下,您訪問同一個項目兩次。

if (blocks.get(i).x == x) { 
     return blocks.get(i); 
} 

完整的示例

public Block findBlock(int x} { //The class name is Block 

    for(Block block : blocks) { 
     if(block.x == x { 
     return block; 
     } 
    } 

    return null; 
} 

另外要注意,返回null可能引起的問題,因此被認爲是不好的做法。你能避免空,感謝檢查異常,缺省值或使用Null object

有在Java中8這一共同的編碼模式從Guava library使用Optional<T>類的本地實現可以解決這個問題的Java < 8的版本。

public Optional<Block> findBlock(int x} { //The class name is Block 

    for(Block block : blocks) { 
     if(block.x == x { 
     return Optional.of(block); 
     } 
    } 

    return Optional.empty(); 
} 

使用

public void someActionWithBlocK() { 

     Optional<Block> block = findBlock(5); 

     if(block.isPresent()) { 
     //some action with block 
     } 
    }