我在产品实现中有以下代码
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和catch。编译器抛出错误,说它无法被捕获。
你能不能给我一些我错误的指示?
非常感谢!!
答案 0 :(得分:3)
您忘记了每个可用产品的情况p.getId()== product.getId()为false。遵循通用代码片段逻辑,如果没有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,以简化集合操作。
答案 1 :(得分: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());
}
答案 2 :(得分:0)
使用您拥有的代码,很难给出明确的答案。问题是没有达到代码的else路径,你应该使用调试器来找出原因。
然而,某些提示可以解决问题:
1)将if (p.getId() == product.getId()) {
更改为if (p.getId().equals(product.getId())) {
我认为您的目的是检查id对象的相等性而不是它们的引用。
2)逐步调试调试器以查看是否已达到else,或者让初学者验证try-catch是否正常工作只是注释掉代码,如果哪个会让你相信try-catch正在工作并且你的代码停留在if路径中,因此不会抛出异常
答案 3 :(得分: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());
}
}