1

我在产品实现中有以下代码

public void updateProduct(Product product) throws ProductNotFoundException {

    Iterator<Product> it = allProducts.iterator();
    Product p = null;
    if (!allProducts.isEmpty()) {
        while (it.hasNext()) {
            p = it.next();
            if (p.getId() == product.getId()) {
                p.setPrice(product.getPrice());
                System.out.println("Successfully updated the product "
                        + product.getId());
            }
        }
    } else {
        System.out.println("No such product " + product.getId());
        throw new ProductNotFoundException(product.getName());
    }
}

// 主要的

ipod.setId(Integer.MAX_VALUE);

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

Junit 抛出以下异常

Exception in thread "main" productdb.util.AssertionFailedError: should've gotten ProductNotFoundException
    at productdb.util.Assert.fail(Assert.java:43)
    **at productdb.ProductDBClient.testProductServer(ProductDBClient.java:85)**
    at productdb.ProductDBClient.main(ProductDBClient.java:20)

不幸的是,我无法使用 try and catch。编译器抛出错误,说它无法被捕获。

你能给我一些我做错的地方吗?

非常感谢!!

4

4 回答 4

3

您忘记了每个可用产品 p.getId() == product.getId() 为假的情况。按照一般代码片段逻辑,如果没有 id 与请求匹配,您还应该抛出异常。像这样重写它:

    public void updateProduct(Product product) throws ProductNotFoundException {
    for (Product existing : allProducts) {
        if (existing.getId() == product.getId()) {
            existing.setPrice(product.getPrice());
            return;
        }
    }
    System.out.println("No such product " + product.getId());
    throw new ProductNotFoundException(product.getName());
}

您还可以查看一些函数式库,例如 Guava,以简化对集合的操作。

于 2013-05-31T05:39:00.957 回答
1

我没有看到它会抛出“ProductNotFoundException”的任何原因

if (!allProducts.isEmpty()) {
        //Code
} else {
        System.out.println("No such product " + product.getId());
        throw new ProductNotFoundException(product.getName());
}

显然如果你的 allProducts 不为空,它永远不会抛出异常

您的代码的正确版本 [假设您无法更新产品,则抛出异常]

public void updateProduct(Product product) throws ProductNotFoundException {

    Iterator<Product> it = allProducts.iterator();
    Product p = null;
    if (!allProducts.isEmpty()) {
        while (it.hasNext()) {
            p = it.next();
            if (p.getId() == product.getId()) {
                p.setPrice(product.getPrice());
                System.out.println("Successfully updated the product "
                        + product.getId());
                return;
            }
        }
    } 
    throw new ProductNotFoundException(product.getName());
}
于 2013-05-31T05:35:35.247 回答
0

使用您拥有的代码,很难给出明确的答案。问题是没有到达代码的 else 路径,您应该使用调试器找出原因。

但是解决问题的一些技巧:

1)更改if (p.getId() == product.getId()) {if (p.getId().equals(product.getId())) {我认为您的意图是检查 id 对象的相等性,而不是它们的引用。

2) 单步调试调试器以查看是否达到 else,或者让初学者验证 try-catch 是否正常工作,只需注释掉 if 中的代码,这将使您确信 try-catch 正在工作并且您的代码保留在如果路径,因此不会抛出异常

于 2013-05-31T05:36:14.107 回答
0

原因是,即使在现有产品中找不到产品,您也永远不会抛出异常。只有当您没有任何产品时才会抛出异常。试试这个代码:

public void updateProduct(Product product) throws ProductNotFoundException {

    Iterator<Product> it = allProducts.iterator();
    Product p = null;
    if (!allProducts.isEmpty()) {
        while (it.hasNext()) {
            p = it.next();
            if (p.getId() == product.getId()) {
                p.setPrice(product.getPrice());
                System.out.println("Successfully updated the product "
                        + product.getId());
            }
        }
    }

    if (p == null ) {
        System.out.println("No such product " + product.getId());
        throw new ProductNotFoundException(product.getName());
    }
}
于 2013-05-31T05:42:49.553 回答