2014-03-02 85 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 
     } 
    }