Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Yager2222 en 21 de Mayo 2020, 18:11
-
Buenas amigos del foro, estoy teniendo problemas con el proyecto que estoy desarrollando:
La primera tabla sí que se me genera con el título, autor y precio.
El fallo me da al querer recuperar los libros en los que seleccioné la opción comprar en una segunda tabla, y me da el siguiente error:
Estado HTTP 500 – Internal Server Error
Tipo Informe de Excepción
Descripción El servidor encontró un error interno que hizo que no pudiera rellenar este requerimiento.
excepción
java.lang.NullPointerException
sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1838)
sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
java.lang.Double.parseDouble(Double.java:538)
modelo.GestionVentas.service(GestionVentas.java:39)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
nota La traza completa de la causa de este error se encuentra en los archivos de registro del servidor.
GestionVentas.java
package modelo;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import beans.Libro;
@WebServlet("/GestionVentas")
public class GestionVentas extends HttpServlet {
private static final long serialVersionUID = 1L;
public GestionVentas() {
super();
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Libro> lista = null;
HttpSession misesion = request.getSession();
lista= (ArrayList<Libro>)misesion.getAttribute("lista");
if (lista == null)
lista= new ArrayList<Libro>();
switch(request.getParameter("opcion")) {
case "comprar":
String titulo = request.getParameter("titulo");
String autor = request.getParameter("autor");
String precio = request.getParameter("precio");
double e = Double.parseDouble(precio);
Libro l = new Libro(titulo, autor, e);
lista.add(l);
misesion.setAttribute("lista", lista);
request.getRequestDispatcher("libros.jsp").forward(request, response);
break;
case "eliminar":
lista.remove(Integer.parseInt(request.getParameter("id")));
misesion.setAttribute("lista", lista);
request.getRequestDispatcher("libros.jsp").forward(request, response);
break;
}
}
}
---------------------------
libros.jsp
<%@page import="beans.Libro"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML>
<html>
<head>
<title>libros</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>
<h1>Listado de libros</h1>
<table border="1">
<tr><th></th><th>Titulo</th><th>Autor</th><th>Precio</th></tr>
<c:forEach items="${requestScope.libros}" var="libro" varStatus="i">
<tr>
<td><a href="GestionVentas?opcion=comprar&id=${i.index}">
<input type="submit" value="Comprar"/></a></td>
<td>${libro.titulo}</td>
<td>${libro.autor}</td>
<td>${libro.precio}</td>
</tr>
</c:forEach>
</table>
<br/><br/>
<br/><br/>
<table border=1 cellspacing=1 cellpadding=7 bordercolor="black">
<tr><th></th><th>Titulo</th><th>Autor</th><th>Precio</th></tr>
<c:forEach items="${sessionScope.lista}" var="libro2" varStatus="i">
<tr>
<td><a href="GestionVentas?opcion=eliminar&id=${i.index}">
<input type="submit" value="eliminar"/></a></td>
<td><c:out value="${libro2.titulo}"></c:out></td>
<td><c:out value="${libro2.autor}"></c:out></td>
<td><c:out value="${libro2.precio}"></c:out></td>
</tr>
</c:forEach>
</table>
<a href="Controller?op=doTemas">Otro tema</a>
<br/><br/>
</body>
</html>
Saludos
-
Hola.
Quizás no está recibiendo correctamente el dato de precio y al querer parsearlo a Double se produce la excepción.
Los parseos de cadenas String a valores numéricos siempre son "arriesgados", así que hay que poner medidas de control para decidir que hacer en caso de que no sea posible parsear y evitar que el programa se interrumpa porque no sabe que hacer.
Puedes usar try catch
double e;
try {
e = Double.parseDouble(precio);
} catch (Exception ex) {
e = 0d; //Parseo ha fallado, damos un valor double a e, aunque sea 0, para que el programa continúe
}
Ahí en el catch, hacemos que al menos la variable e obtenga un valor double válido.
Así el programa podrá continuar y se creará un objeto libro, con un precio de 0, pero al menos el programa continúa y puedes comprobar si el resto del código está funcionando bien.
En el catch puedes hacer lo que quieras, puedes pedirle que te muestre el valor del String precio, para ver por qué no ha sido posible parsearlo a double.
-
Muchas gracias Kabuto.
Me ha servido para ver que no está recibiendo correctamente ninguno de los datos. Tendré que seguir mirando que estoy haciendo mal en el "switch" al pasar los datos.
Gracias por la explicación
Saludos