2013-05-31 96 views
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。編譯器發出錯誤說它不能被捕獲。

你可以請我提供一些指針,我不正確的做?

非常感謝!

+0

好像你沒有正確地把代碼。 「allProducts」在哪裏定義? – Reddy

+1

我覺得這個問題有點不清楚。您說發生了編譯錯誤,但是您還包含運行時拋出的異常,表明代碼必須已成功編譯(要執行)。 – Vulcan

+0

聽起來像你期待的那樣,當'iPod'產品找不到時就會拋出異常,但實際上只有在'allProducts'爲空時纔會拋出異常(我猜測它不是)。 – jerry

回答

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()); 
} 
+0

謝謝雷迪。這件作品很有魅力 – Newbie

0

你的代碼,很難給出明確的答案。問題是沒有達到代碼的其他路徑,你應該使用調試器來找出原因。

但是某些技巧來解決這個問題:

1)改變if (p.getId() == product.getId()) {if (p.getId().equals(product.getId())) {我覺得你的意圖是檢查對象的ID的平等,而不是他們的參考。

2)通過調試器來查看是否已到達else,或者對於初學者來驗證try-catch是否正在工作只是註釋掉代碼中是否會讓您相信try-catch正在工作而您的代碼保留在if路徑中,因此不會拋出異常

+0

這是非常寶貴的意見。非常感謝 – Newbie

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()); 
} 

您還可以看看一些功能性風格的圖書館,如番石榴,以緩解集合操作。

+0

謝謝JK1。這工作。 – Newbie

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()); 
    } 
} 
+0

感謝您的輸入。它仍在拋出異常。 – Newbie