2012-05-12 10 views
3

サーバーで初めてJavaサーブレットを実行すると、すべてのWebページが正常に動作し、問題はありません。しかし、サーバーを停止して再起動してサーブレットを再実行すると、1ページにNULLポインタ例外があります。私はこのエラーが発生したところで何かを印刷しようとしましたが、そこにSystem.out.printl("something")と書き込んでサーブレット(何度もサーバを再起動します)をもう一度実行すると、それ以上の例外はスローされません。JavaサーバーでのWebプログラミング、NULLポインタ例外

誰でもこの問題を解決できますか?ここで

は、例外が

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    ShoppingCart cart = (ShoppingCart)request.getSession().getAttribute("Cart"); 
    ProductCatalog pc = (ProductCatalog) request.getServletContext().getAttribute("Product Catalog"); 
    String id = request.getParameter("productID"); 
    if(id != null){ 
     Product pr = pc.getProduct(id); 
     cart.addItem(pr); // here is null pointer exception 
    } 
    RequestDispatcher dispatch = request.getRequestDispatcher("shopping-cart.jsp"); 
    dispatch.forward(request, response); 
} 

を投げているdoPostメソッドであり、ここで、カートクラスです:

プライベートConcurrentHashMapのアイテム。あなたは私はあなたがNULLポインタを引き起こしているフォームを再送信している推測して再起動するときは、カート属性を取得するときに、セッションを取得しようとする場合、または、これはどちらか起こっている

/** Creates new Shopping Cart */ 
public ShoppingCart(){ 
    items = new ConcurrentHashMap<Product, Integer>(); 
} 

/** Adds a product having this id into cart and increases quantity. */ 
//This method is called after "add to cart" button is clicked. 
public void addItem(Product pr){ 
    System.out.println(pr.getId() + " sahdhsaihdasihdasihs"); 
    if(items.containsKey(pr)){ 
     int quantity = items.get(pr) + 1; 
     items.put(pr, quantity); 
    } else { 
     items.put(pr, 1); 
    } 
} 

/** 
* Adds a product having this id into cart and 
* increases quantity with the specified number. 
* If quantity is zero, we remove this product from cart. 
*/ 
//This method is called many times after "update cart" button is clicked. 
public void updateItem(Product pr, int quantity){ 
    if(quantity == 0)items.remove(pr); 
    else items.put(pr, quantity); 
} 

/** Cart iterator */ 
public Iterator<Product> cartItems(){ 
    return items.keySet().iterator(); 
} 

/** Returns quantity of this product */ 
public int getQuantity(Product pr){ 
    return items.get(pr); 
} 
+9

こんにちは、私たちはコードが不足しているので、英語をあまり心配していません。私たちはすべてコードを発言しています:)あなたがそれを投稿すれば、私たちはあなたを助ける良い機会を得ます。がんばろう! P.S.質問の下に**編集**をクリックすると、質問の本文にコードを追加できます。 – jmort253

+1

:)ありがとう、私はコードを追加しました – Kote

答えて

0

。 cart.addItemを呼び出すと、カートオブジェクトはnullになります。

1

例外はcartnullあるので、それはある... ...ここ

cart.addItem(pr); 

がスローされた場合。最も可能性の高い説明は、この呼び出しがnullを返すことです。

セッションが(まだ) "Cart"エントリが含まれていないため、起きてしまう
request.getSession().getAttribute("Cart"); 

。あなたがしなければならないことは、その呼び出しの結果をテストすることです。 nullが返された場合は、新しい ShoppingCartオブジェクトを作成し、Session.setAttribute(...)を使用して、セッションを使用する次のリクエストのセッションオブジェクトに追加する必要があります。

+1

私はこのセッションのクラスでこれを持っています: public void sessionCreated(HttpSessionEvent arg0){ ShoppingCart cart = new ShoppingCart(); arg0.getSession()。setAttribute( "Cart"、cart); } なぜそれでは不十分ですか? – Kote

+0

しかし、ありがとう私は試してみます – Kote

+0

それは動作します、ありがとう。私はなぜそれが2回目にnullを返すのか分からなかった – Kote