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

Título: Error java.lang.Double.parseDouble excepción java.lang.NullPointerException sun.
Publicado 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:

Código: [Seleccionar]
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

Código: [Seleccionar]
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


Código: [Seleccionar]
<%@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
Título: Re:AYUDA (JAVA): ERROR Double.parseDouble
Publicado por: Kabuto en 21 de Mayo 2020, 18:45
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

Código: [Seleccionar]
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.
Título: Re:AYUDA (JAVA): ERROR Double.parseDouble
Publicado por: Yager2222 en 21 de Mayo 2020, 19:19
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