我的问题是,我想从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);
}
}
}
答案 0 :(得分:2)
您有两个问题:
blocks.size()==0
您的方法没有返回任何内容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循环,这是在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;