【问题标题】:JAVA update ArrayList object method not updatingJAVA更新ArrayList对象方法不更新
【发布时间】:2015-11-15 23:12:38
【问题描述】:

我有一个实现另一个超类的接口测试类。在测试类中,我有一个方法应该从数组列表中更新一个对象;首先它应该检查对象是否在列表中,如果是,它将删除并添加一个新对象(替换)。如果找不到对象,它将抛出异常消息。这是我实现的代码:

public class ProductDBImpl implements ProductDB {

// field declarations
ArrayList<Product> products = new ArrayList<Product>();
@Override
public void updateProduct(Product product) throws ProductNotFoundException 
{
    // TODO Auto-generated method stub
    Iterator<Product> pritr = products.iterator();
    while(pritr.hasNext())
    {
        Product pr = pritr.next();

        if (!pr.getId().equals(product.getId()))
        {

            throw new ProductNotFoundException("Product does no exist");

        }
        pritr.remove();

    }
    products.add(product);

}

首先我不知道这是否是正确的方法。而且,当我使用测试客户端脚本对其进行测试时,我收到一条错误消息:

Exception in thread "main" productdb.util.AssertionFailedError: should've gotten ProductNotFoundException

测试客户端代码如下:

    ipod.setId(Integer.MAX_VALUE);
    try {
        productDB.updateProduct(ipod);
        Assert.fail("should've gotten ProductNotFoundException");
    } catch (ProductNotFoundException pnfe) {
        // expecting this
    }

请帮我找出我的错误。谢谢。

最新编辑 我根据收到的反馈更新了我的代码,我收到了第一个引发错误的项目:

public void updateProduct(Product product) throws ProductNotFoundException 
    {
        // TODO Auto-generated method stub
        Iterator<Product> pritr = products.iterator();
        while(pritr.hasNext())
        {
            Product pr = pritr.next();
            System.out.println(pr.getId());
            System.out.println(product.getId());
            if (pr.getId().equals(product.getId()))
            {

                pritr.remove();

            }
            else
            {
                throw new ProductNotFoundException("Product Not Found");
            }

        }
        products.add(product);

    }

另一个更新

public void updateProduct(Product product) throws ProductNotFoundException 
{
    // TODO Auto-generated method stub
    Iterator<Product> pritr = products.iterator();
    boolean match = true;
    while(pritr.hasNext())
    {
        Product pr = pritr.next();
        if (pr.getId().equals(product.getId()))
        {

            pritr.remove();

        }
        else
        {
            match = false;
        }

    }
    if (match == false)
    {
        new ProductNotFoundException("Product not found");
    }
    else
    {
        products.add(product);
    }


}

【问题讨论】:

  • 您在迭代的第一步抛出异常。当所需元素是列表中的第二个或最后一个元素时,您认为会发生什么?
  • 正如@LuiggiMendoza 提到的那样——你需要在头脑中或在纸上仔细检查你的代码,因为你的错误应该很明显。
  • 那么我是否必须先遍历整个列表,然后将异常放在 while 循环之外?对不起,如果问题看起来很愚蠢,但我想我仍然很困惑并试图理解。
  • @DeeTee - 伙计。我不知道你为什么无视我们的建议。但请相信我,我已经编程了 40 多年,并且在这些年里教人们编程。如果你不明白你的代码在说什么,你>>需要
  • “你怎么知道我还没有尝试过?” - 我们没有,但如果你做得正确,那么你就会解决你的问题。因为那 >> 是

标签: java methods arraylist


【解决方案1】:

再次,遍历您的逻辑。你有这个:

public void updateProduct(Product product) throws ProductNotFoundException 
{
    // TODO Auto-generated method stub
    Iterator<Product> pritr = products.iterator();
    boolean match = true;
    while(pritr.hasNext())
    {
        Product pr = pritr.next();
        if (pr.getId().equals(product.getId()))
        {

            pritr.remove();

        }
        else
        {
            match = false;
        }

    }
    if (match == false)
    {
        new ProductNotFoundException("Product not found");
    }
    else
    {
        products.add(product);
    }


}

翻译为:

start method
    set match to true
    while loop
        if product found remove original product
        else match is set to false  // this will always happen one or more times!
    end while loop

    // match is almost guaranteed to be false!
    check match. if false, throw exception
    else if true, add new product
end method

现在假设数据是:

No match  
No match  
No match  
match  
No match  
No match

然后看看会发生什么。根据您的逻辑,布尔值在不应该的时候最终会是假的。

将此与应该引发异常的数据进行比较:

No match  
No match  
No match  
No match  
No match  
No match

再看看会发生什么。

你想要什么:

start method
    set match to false
    while loop
        if product found 
             remove original product
             replace with new product
             set match to true
        // no else block needed
    end while loop

    check match. if false, throw exception
    else if true, add new product
end method

start method
    // no need for match variable
    while loop
        if product found 
             remove original product
             replace with new product
             set match to true
             return from method // *****
    end while loop

    // if we reach this line, a match was never found
    throw exception

end method

【讨论】:

  • 在 if product found 块中,我使用 remove() 然后 add() 来“替换”。这是正确的吗?
  • @dee 试试吧!还要检查答案的变化。同样,我的目标是让您能够在脑海中浏览您的代码。没有什么比这更重要了。
  • 也许您应该停止尝试帮助解决方案不佳的人。显然你建议的所有事情都没有奏效。
  • @DeeTee 帮助是你的功劳。如果您不能“捡起球并带球跑”,请不要责怪努力协助的人。
  • @Hovercraft Full Of Eels 感谢您的帮助。您的解决方案,尤其是有效的解决方案(最后一个)都是正确的。我能够完成我的任务。对不起所有粗鲁的 cmets 并感谢您的帮助。
【解决方案2】:

Assert.fail 在没有抛出异常时执行,如果出现这种情况:

  • 列表 (products) 的 first(这似乎是一个不必要的错误!)元素中的任何一个都具有相同的 id
  • 或列表 (products) 为空

列表的内容是什么?

【讨论】:

  • 列表的内容是Product类型的对象。
  • @DeeTee - 这不是他问的。他想知道>>什么
  • 好的,这些产品有哪些ID?结果似乎表明其中一种产品确实具有 id Integer.MAX_VALUE
  • ID 是产品 ID;整数。
  • 顺便说一句:我确实花了很多时间试图了解你的所作所为,你没有回答我的问题,现在我是敌对的?
猜你喜欢
  • 2011-01-31
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多