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 と catch を使用できません。コンパイラは、キャッチできないというエラーをスローしています。

私が間違っているところを教えてください。

どうもありがとう!!

4

4 に答える 4

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 などの関数型スタイルのライブラリを検討することもできます。

于 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 path したがって、例外をスローしません

于 2013-05-31T05:36:14.107 に答える