2015-02-04 2 views
0

У меня проблема при получении данных (значение Integer) между сервлетами, когда я хочу умножить полученное значение. У меня есть эта функция в моем первом сервлета,NullPointer пытается получить значение Integer

 private int totalNumberOf(Map<String,Integer> cart) { 
    int counter = 0; 

    for (String key : cart.keySet()) 
     counter += cart.get(key); 

    return counter; 
} 

И у меня также есть атрибут для него (помещенного в конце метода doGet()) ...

 req.setAttribute("quantity", new Integer(totalNumberOf(cart))); 

, функция, дает мне общее количество продуктов в корзине, которое обновляет значение каждый раз, когда я добавляю что-то в корзину, поэтому, когда я закончу покупку, я могу получить обновленную стоимость количества продуктов, которые в настоящее время находятся в корзине.

Проблема возникает сейчас, когда я пытаюсь сделать вымышленный чек (потому что у меня есть общая цена для каждого типа продукта), и мне нужно умножить количество предметов по общей цене (вот где NullPointer показывает вверх).

Вот код моего второго сервлета,

@Override 
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { 

    HttpSession session = req.getSession(); 

    Integer quantity; 
    int toPay; 
    int genericValue = 20; 

    quantity = (Integer) req.getAttribute("quantity"); 

    toPay = quantity.intValue() * genericValue; // NullPointer 

} 

Я пробовал все, во всех отношениях, но я не могу избавиться от этой уродливой NullPointer. Надеюсь, что вы можете помочь мне немного с этим ...

UPDATE servlet1

@Override 
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { 

    String mensajeBienvenida = ""; 
    Map<String,Integer> carrito = null; 

    String articuloElegido = req.getParameter("producto"); 

    HttpSession session = req.getSession(); 

    if (session.isNew()) { 
     session.invalidate(); 
     RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/error.html"); 
     dispatcher.forward(req, res); 
    } 
    else { 
     String nombreUsuario = ((Usuario)session.getAttribute("user")).getNombre(); 
     if (session.getAttribute("carrito") == null) { 
      carrito = new HashMap<String,Integer>(); 
      session.setAttribute("carrito",carrito); 
      mensajeBienvenida="Bienvenido a la tienda, " + nombreUsuario + "!"; 
     } 
     else { 
      carrito = (Map<String,Integer>) session.getAttribute("carrito"); 
      mensajeBienvenida = "Qué bien que sigas comprando, " + nombreUsuario + "!"; 
     } 
     insertarEnCarrito(carrito, articuloElegido); 
    } 
    req.setAttribute("mensaje", mensajeBienvenida); 
    req.setAttribute("cesta", cestaDeLaCompraEnHTML(carrito)); 
    req.setAttribute("cantidad", numeroTotalLibros(carrito)); 
    RequestDispatcher dispatcher = getServletContext().getNamedDispatcher("VistaTienda"); 
    dispatcher.forward(req, res); 

} 

@Override 
public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { 
     doGet(req,res); 
} 

private void insertarEnCarrito(Map<String,Integer> carrito, String articulo) { 
    if (carrito.get(articulo) == null){ 
     carrito.put(articulo, new Integer(1)); 
    } 
    else { 
     int numeroArticulos = (Integer)carrito.get(articulo).intValue(); 
     carrito.put(articulo, new Integer(numeroArticulos+1)); 
    } 
} 

private String cestaDeLaCompraEnHTML(Map<String,Integer> carrito) { 
    String cestaEnHTML = ""; 

    for (String key : carrito.keySet()) 
     cestaEnHTML += "<p>["+key+"], "+carrito.get(key)+" unidades</p>"; 
    return cestaEnHTML; 
} 

private int numeroTotalLibros(Map<String,Integer> carrito) { 
    int counterLibro = 0; 

    for (String key : carrito.keySet()) 
     counterLibro += carrito.get(key); 

    return counterLibro; 
} 

}

servlet2

@Override 
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { 

    String mensajeBienvenida; 
    String cestaDeLaCompraEnHTML; 

    mensajeBienvenida = (String) req.getAttribute("mensaje"); 
    cestaDeLaCompraEnHTML = (String) req.getAttribute("cesta"); 

    res.setContentType("text/html"); 
    PrintWriter out = res.getWriter(); 

    out.println("<HTML>"); 
    out.println("<HEAD><TITLE>Tienda con login!</TITLE></HEAD>"); 
    out.println("<BODY>" + mensajeBienvenida + "<br>"); 
    out.println(cestaDeLaCompraEnHTML + "<br>"); 
    out.println("PRUEBA CANTIDAD LIBROS EN TOTAL - " + req.getAttribute("cantidad") + "<br>"); 
    out.println("<a href=\"form.html\">Seguir comprando!</a></BODY></HTML>"); 
    out.println("<a href=\"login.html\">Anular Compra</a></BODY></HTML>"); 
    out.println("<a href=\"pagar\">Pagar Compra</a></BODY></HTML>"); 

} 

@Override 
public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { 
     doGet(req,res); 
} 

Servlet3

@Override 
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { 

    HttpSession session = req.getSession(); 

    Integer cantidadLibro; 
    int pagar; 
    int valorLibro = 20; 

    Map<String,Integer> carrito = (Map<String,Integer>) session.getAttribute("carrito"); 
    Usuario usuario = (Usuario) session.getAttribute("user"); 
    cantidadLibro = (Integer) req.getAttribute("cantidad"); 

    if (cantidadLibro == null){ 
     cantidadLibro = 0; 
    } else { 
     cantidadLibro = (Integer) req.getAttribute("cantidad"); 
    } 

    // pagar = cantidadLibro.intValue() * valorLibro; 

    res.setContentType("text/html"); 
    PrintWriter out = res.getWriter(); 

    out.println("<HTML>"); 
    out.println("<HEAD><TITLE>Tienda con login!</TITLE></HEAD>"); 
    out.println("<BODY><p><b>COMPRA REALIZADA!</b><br>"); 
    out.println("<br><p>Total a pagar por su compra - " + "<br>"); 
    out.println("<br><p>PRUEBA getAttribute - " + req.getAttribute("cantidad") + "<br>"); 
    out.println("<br><p>Gracias por su compra " + usuario.getNombre() + " " + usuario.getApellidos() + "<br>"); 
    out.println("<br><p>e-mail del usuario - " + usuario.getEmail() + "<br>"); 
    out.println("<br><p>User ID - " + usuario.getId() + "<br>"); 

    session.invalidate(); 

} 

@Override 
public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { 
     doGet(req,res); 
} 
+1

Где вы делаете 'req.setAttribute (" cantidad ", новый Integer (numeroTotalLibros (carrito)));'? –

+0

Подтвердите, что 'req.getAttribute (« количество »)' на самом деле дает значение – Ascalonian

+0

req.setAttribute («cantidad», новый Integer (numeroTotalLibros (carrito))); req.setAttribute («количество», новый Integer (totalNumberOf (cart))); Простите за это. Его помещают в конец метода doGet(). –

ответ

0

Помимо рефакторинга и оптимизации, которые могут потребоваться для вашего кода, проблема, о которой вы говорите, заключается в том, что вы устанавливаете атрибут «cantidad» для запроса вместо сеанса.

В servlet1, замените этот

req.setAttribute("cantidad", numeroTotalLibros(carrito)); 

с этим

session.setAttribute("cantidad", numeroTotalLibros(carrito)); 

И в Servlet3, замените этот

cantidadLibro = (Integer) req.getAttribute("cantidad"); 

с этим

cantidadLibro = (Integer) session.getAttribute("cantidad"); 

Причина в том, что вы перенаправляете свой запрос с Servlet1 на Servlet2, и поэтому в Servlet2 вы можете получить доступ к «перенаправленному» запросу и всем его атрибутам, но Serlvet3 вызывается независимо на более позднем этапе. Наверное, это когда вы нажимаете «Pagar» на отображаемой странице HTML. Поэтому вы не можете больше обращаться к этим атрибутам через запрос, потому что это другой запрос. Вместо этого вы можете получить доступ к ним через сеанс, если вы их ранее сохранили.

Надеюсь, что это поможет.

+0

Большое спасибо Педро! Я был настолько запутан с NullPointer, что даже не мог видеть, что решение было там с переменной «usuario»! Благодаря! –

0

Вы когда-нибудь слышали о debugging инструментах?

Ваша переменная quantity имеет значение null, это может быть из-за атрибута abscense quantity в запросе. Вот почему вы получили NPE: null * (primitive numeric constant) ->NullPointerException.

0

Вероятно, ваша функция getAttribute вернула значение null. Не забудьте выполнить нулевую проверку кода. Я предлагаю if (quantity != null) чек, прежде чем вы позвоните .intValue()

Еще одно возможное решение - проверить, что возвращает .getAttribute(), а не проверять, какое количество было установлено. Вы также можете указать значение по умолчанию.

if (req.getAttribute("quantity") == null) { 
    quantity = 0; 
} else { 
    quantity = (Integer) req.getAttribute("quantity"); 
} 
+0

Я добавил нулевой код проверки в сервлет и да, getAttribute возвращает null, но почему он даже не сохраняет его? Не поддерживает ли метод setAttribute любой объект, который вы передаете ему, и идентифицирует его со строкой, с которой вы хотите ее идентифицировать? –

+0

Вы подтвердили, что 'new Integer (totalNumberOf (cart))' возвращает ожидаемое значение? – Ascalonian

+0

Да, я уже это подтвердил. После этого появляется еще один сервлет, показывающий продукты, которые у меня есть в данный момент в корзине, где я добавил строку, где показан атрибут, и это правильно. –

0

Из вашего кода это выглядит так: "quantity.intValue()" бросает ваш нулевой указатель, потому что количество равно null. Попробуйте это:

@Override 
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { 

HttpSession session = req.getSession(); 

Integer quantity = 0; 
int toPay; 
int genericValue = 20; 

if (req.getAttribute("quantity") != null) { 
    quantity = (Integer) req.getAttribute("quantity"); 
} 


toPay = quantity.intValue() * genericValue; 

} 

Обратите внимание не только инициализирую количество со значением 0 (так что не равно нулю) Я также добавить нулевой чек «req.getAttribute (» количество «)», так что вы не присваивайте значение null количеству в случае, когда .getAttribute возвращает значение null.

Смежные вопросы