我有一个实现另一个超类的接口测试类。在测试类中,我有一个方法,它应该从数组列表返回一个对象;首先它应该检查列表中的对象以查看它是否存在,如果不存在,它将返回null,否则它将返回找到的对象。这是我实施的代码:
public class ProductDBImpl implements ProductDB {
// field declarations
ArrayList<Product> products = new ArrayList<Product>();
@Override
public Product getProduct(int productId)
{
// TODO Auto-generated method stub
// create an iterator for the Arraylist
Iterator<Product> pritr = products.iterator();
while(pritr.hasNext())
{
Product pr = pritr.next();
if (pritr.next().getId() == productId)
{
return pr;
}
else
{
return null;
}
}
}
不幸的是我收到的错误是: 此方法必须返回Product类型的结果。
我的印象是,通过使用迭代器并循环遍历列表中的每个元素,每个元素都是一个类型Product。请帮我识别我的错误。
答案 0 :(得分:5)
您的return
语句返回Product
或null
,两者都是getProduct
合法的。但是,如果pritr.hasNext()
没有false
,Product
会立即返回return
怎么办?如果while
循环因此退出,则没有return
语句。
在while
循环后添加while
语句。
另外,因为你总是在if
循环的第一次迭代中返回一些东西,所以它不必是一个循环。您可以将其更改为null
而无需更改任何其他内容。
但这真的是你想要的吗?如果找到的第一个产品不匹配,则返回else
没有意义。您可以考虑删除while
阻止,继续搜索列表(而不是将if
更改为{{ pages[training_missions].application_name.mobile }}
)。
答案 1 :(得分:4)
要处理错误,您需要在return
循环结束时使用while
语句,正如rgettman指出的那样。但是你也不应该在循环中返回null
。您应该只在循环完成后返回null
,并且未找到匹配的产品,如下所示:
@Override
public Product getProduct(int productId)
{
Iterator<Product> pritr = products.iterator();
while (pritr.hasNext())
{
Product pr = pritr.next();
if (pritr.next().getId() == productId)
{
return pr;
}
}
return null;
}
答案 2 :(得分:2)
您共享的代码存在逻辑错误。您的意图是在找到匹配产品时返回匹配产品,否则返回null。如果你找到了你的产品,它会更好地添加一个休息时间。正确的代码是......
public class ProductDBImpl implements ProductDB {
// field declarations
ArrayList<Product> products = new ArrayList<Product>();
@Override
public Product getProduct(int productId)
{
// TODO Auto-generated method stub
// create an iterator for the Arraylist
Iterator<Product> pritr = products.iterator();
Product productObj = null;
while(pritr.hasNext())
{
Product pr = pritr.next();
if (pritr.next().getId() == productId)
{
productObj = pr;
break;
}
}
return productObj;
}
答案 3 :(得分:0)
如果你有兴趣,在Java 8中,这可以用不同的方式完成,没有讨厌的&#34; null&#34; s和更具说明性的风格。
因此,您希望从数组列表中返回具有指定标识的产品。
由于产品很可能不存在,因此可以使ProductDB接口返回Product
public class ProductDBImpl implements ProductDB{
ArrayList<Product> products = new ArrayList<>();
@Override
public Optional<Product> getProduct(int productId) {
return products.stream()
.filter(p -> p.getId() == productId)
.findFirst();
}
}
。这样,界面的用户可以更清楚地了解预期的内容。
在get product函数中,只需从产品列表中获取Optional
,过滤具有所需productId的元素并返回第一个元素。
popIn.delegate = self;
[annotation.layer addAnimation:popIn forKey:@"popIn"];