从Arraylist返回对象

时间:2014-03-02 18:19:05

标签: java arraylist return

我的问题是,我想从ArrayList“块”返回一个对象。 我的代码不起作用 - 错误说This method must return a result of type block

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

3 个答案:

答案 0 :(得分:2)

您有两个问题:

  1. 如果blocks.size()==0您的方法没有返回任何内容
  2. 如果blocks中的任何一个块都没有block.x==x,则您的方法不会返回任何内容。
  3. 在Java中,方法必须返回一个值,声明这样做。

    您问题的最简单解决方案是在方法结束时return null

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

    请注意,这使用了一个增强的for循环,这是在Java中循环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();
    }
    

答案 1 :(得分:1)

您的方法存在的问题是存在不执行返回块的情况。在这种情况下,如果未声明方法无效,则必须为其声明出口点。

您可以使用return退出或抛出异常。如果找不到请求的值,则选择取决于程序应该执行的操作。

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

,您可以避免null

Java 8中存在这种通用编码模式的本机实现。使用Optional<T>中的Guava library类可以解决Java&lt;版本的问题。 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
      }
  }

答案 2 :(得分: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;