Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Fallo al intentar pasar un null a Integer

Estas en el tema de Fallo al intentar pasar un null a Integer en el foro de Java en Foros del Web. Buenas de nuevo Como he puesto en el titulo, el fallo es por eso mismo, llega un valor null (que no deberia ser null) y ...
  #1 (permalink)  
Antiguo 26/05/2015, 05:14
 
Fecha de Ingreso: mayo-2015
Mensajes: 7
Antigüedad: 9 años, 6 meses
Puntos: 0
Fallo al intentar pasar un null a Integer

Buenas de nuevo

Como he puesto en el titulo, el fallo es por eso mismo, llega un valor null (que no deberia ser null) y como luego intento convertirlo a int, pues me salta el error:

Código:
public int ejemplarRand(int idLi) throws SQLException {
        //int numEj = numEjemplar(idLi);
        int c = 1;
        int numRand = 0;
        int ejReturn = 0;
        conectar();
        //resultSet = statement.executeQuery("SELECT idEjemplar FROM prestamos WHERE idLibro="+idLi+" and fechaDevolucion is NULL");
        resultSet = statement.executeQuery("SELECT idEjemplar FROM ejemplares WHERE idLibro=" + idLi + " and idEjemplar NOT IN(SELECT idEjemplar FROM prestamos WHERE idLibro=" + idLi + " and fechaDevolucion is NULL)");
        resultSet.last();
        String[] idEjemplar = new String[resultSet.getRow()];
        resultSet.first();

        while (resultSet.next()) {
            idEjemplar[c] = resultSet.getString("idEjemplar");
            c++;
        }
        numRand = (int) (Math.random() * idEjemplar.length);
        ejReturn = Integer.parseInt(idEjemplar[numRand]);
        
        desconectar();
        return ejReturn;
    }
Este metodo de arriba, lo uso para que me devuelva un ID aleatorio, pero ese id no puede ser de un ejemplar que ya se encuentra usado (prestado). Realizo la consulta, luego coloco el cursor al final, y creo un array del tamaño del resultSet (numero de filas), y vuelvo a colocar el cursor al inicio del resultset.

Luego dentro del while, y mediante un contador, voy rellenando el array segun los id que me devuelva resultset, por ultimo, creo un numero aleatorio entre 1 y el tamaño del array para seleccionar uno de los id que he recogido en el array y lo devuelvo con el return.

El fallo da aqui:
Código:
ejReturn = Integer.parseInt(idEjemplar[numRand]);
Al hacer el parseInt, le llega un null y provoca el error.

No debería llegar un null, ya que la consulta esta correcta (la he probado en phpmyadmin con los valores que supuestamente he usado cuando da el fallo) y la consulta me devuelve una fila con un id. Por ello estoy aqui, no consigo ver donde falla...


Dejo las lineas del fallo:

Cita:
java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Integer.java:542)
at java.lang.Integer.parseInt(Integer.java:615)
at Clases.MetodosBD.ejemplarRand(MetodosBD.java:148)
at Servlet.Reservar.processRequest(Reservar.java:84)
at Servlet.Reservar.doPost(Reservar.java:125)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:790)
at org.apache.catalina.core.StandardWrapper.service(S tandardWrapper.java:1682)
at org.apache.catalina.core.StandardWrapperValve.invo ke(StandardWrapperValve.java:318)
at org.apache.catalina.core.StandardContextValve.invo ke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke (StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(S tandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipel ine.java:99)
at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doServ ice(CoyoteAdapter.java:415)
at org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:282)
at com.sun.enterprise.v3.services.impl.ContainerMappe r$HttpHandlerCallable.call(ContainerMapper.java:45 9)
at com.sun.enterprise.v3.services.impl.ContainerMappe r.service(ContainerMapper.java:167)
at org.glassfish.grizzly.http.server.HttpHandler.runS ervice(HttpHandler.java:201)
at org.glassfish.grizzly.http.server.HttpHandler.doHa ndle(HttpHandler.java:175)
at org.glassfish.grizzly.http.server.HttpServerFilter .handleRead(HttpServerFilter.java:235)
at org.glassfish.grizzly.filterchain.ExecutorResolver $9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterCha in.executeFilter(DefaultFilterChain.java:284)
at org.glassfish.grizzly.filterchain.DefaultFilterCha in.executeChainPart(DefaultFilterChain.java:201)
at org.glassfish.grizzly.filterchain.DefaultFilterCha in.execute(DefaultFilterChain.java:133)
at org.glassfish.grizzly.filterchain.DefaultFilterCha in.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(Pr ocessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTranspor t.fireIOEvent(TCPNIOTransport.java:561)
at org.glassfish.grizzly.strategies.AbstractIOStrateg y.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStr ategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStr ategy.access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStr ategy$WorkerThreadRunnable.run(WorkerThreadIOStrat egy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPoo l$Worker.doWork(AbstractThreadPool.java:565)
at org.glassfish.grizzly.threadpool.AbstractThreadPoo l$Worker.run(AbstractThreadPool.java:545)
at java.lang.Thread.run(Thread.java:745)

Un aviso para los que esteis revisando esto, esta línea:
Código:
numRand = (int) (Math.random() * idEjemplar.length);
Originalmente había un idEjemplar.length+1, pero me daba error indexoutofbounds:1, asi que quité el +1, pero ahora me salta el error comentado arriba

EDIT:
Esta línea 84 de Reservar.java es donde se llama al metodo
Cita:
at Servlet.Reservar.processRequest(Reservar.java:84)
Un saludo y gracias
  #2 (permalink)  
Antiguo 26/05/2015, 05:49
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: Fallo al intentar pasar un null a Integer

Los arrays empiezan en índice 0, no en 1.

int c = 1;

Está mal
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 27/05/2015, 02:28
 
Fecha de Ingreso: mayo-2015
Mensajes: 7
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Fallo al intentar pasar un null a Integer

Cita:
Iniciado por Xerelo Ver Mensaje
Los arrays empiezan en índice 0, no en 1.

int c = 1;

Está mal
Cierto, lo empecé en 1 porque con el random usaba el +1, evitando que apareciese el 0, pero claro, al usar el +1 daba error indexoutofbounds...

Igualmente, sigo con el mismo fallo

Voy a probar si me devuelve correctamente el id en el resultset, usando una variable en vez de un array

EDIT: Voy cerrando el cerco para encontrar el fallo, he usado una variable solo en vez de array, y funciona correctamente, por lo que se que el valor en el resultSet no es null

Código:
 public int ejemplarRand(int idLi) throws SQLException {
        //int numEj = numEjemplar(idLi);
        int c = 0;
        int numRand = 0;
        int ejReturn = 0;
        conectar();
       
        resultSet = statement.executeQuery("SELECT idEjemplar FROM ejemplares WHERE idLibro=" + idLi + " and idEjemplar NOT IN(SELECT idEjemplar FROM prestamos WHERE idLibro=" + idLi + " and fechaDevolucion is NULL)");
        /*resultSet.last();
        String[] idEjemplar = new String[resultSet.getRow()];
        resultSet.first();

        while (resultSet.next()) {
            idEjemplar[c] = Integer.toString(resultSet.getInt("idEjemplar"));
            c++;
        }
        numRand = (int) (Math.random() * idEjemplar.length);
        ejReturn = Integer.parseInt(idEjemplar[numRand]);*/
        
        while(resultSet.next()){
            ejReturn = resultSet.getInt("idEjemplar");
        }
        
        desconectar();
        return ejReturn;
    }
He dejado comentado las lineas que pueden dar el fallo y añadido el bucle while para la variable, funciona porque yo sé que la consulta solo me va a dar 1 fila, pero para mas ya no funcionaria como debería

Última edición por antoniower; 27/05/2015 a las 02:39
  #4 (permalink)  
Antiguo 27/05/2015, 04:02
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: Fallo al intentar pasar un null a Integer

http://docs.oracle.com/javase/7/docs...ResultSet.html

Cita:
A ResultSet object maintains a cursor pointing to its current row of data. Initially the cursor is positioned before the first row. The next method moves the cursor to the next row
Cita:
resultSet.first();

while (resultSet.next()) {
idEjemplar[c] = Integer.toString(resultSet.getInt("idEjemplar"));
c++;
}
Mueves el cursor a la primera fila, y lo siguiente que haces es decirle que avance a la segunda fila.

Supón que tu consulta devuelve 1 registro, no existirá entonces un registro 2, así que no entra en el bucle y idEjemplar es un array de null. En el caso de que haya más registros, habrá una posición con null (la última) y cuando el aleatorio de esa posición tendrás un NumberFormatException

También podrías asegurarte de que realmente te devuelve datos, que tú creas que estás haciendo una determinada consulta no significa que realmente la estés haciendo.

Utiliza el debugger, es imprescindible para programar.

http://www.vogella.com/tutorials/Ecl...g/article.html
http://docs.oracle.com/javame/config...g_netbeans.htm
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #5 (permalink)  
Antiguo 27/05/2015, 15:59
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años, 7 meses
Puntos: 31
Respuesta: Fallo al intentar pasar un null a Integer

If (datoRecivido==null) datoRecibido=0;
  #6 (permalink)  
Antiguo 28/05/2015, 05:13
 
Fecha de Ingreso: mayo-2015
Mensajes: 7
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Fallo al intentar pasar un null a Integer

Gracias por responder a todos, el fallo debió estar al crear/rellenar el array... Al final me decanté por usar un array dinámico o vector

Código:
import java.util.Vector;
Con esto me ahorro el tener que preocuparme del tamaño del array, de modo que se van añadiendo en el vector mientras mas registros haya en el resultSet (con el resultSet.next())

Doy el tema como solucionado...

Gracias Xerelo, el tema del cursor en el resultSet no lo sabía, la próxima vez lo tendré en cuenta.

Un saludo y gracias a todos.

Etiquetas: clase, fallo, integer, null, sql, string, valor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:03.