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