He buscado un poco acerca del error y todo apunta a que en alguna parte del código deberia haber un objeto pero se encuentra con un null y la aplicación truena.
La aplicación es muy sencilla y se pueden agregar autores a una base de datos en Derby, hay un boton que abre una ventana para dar de alta un Folder, y cada folder tiene asociado un Autor. Para poder dar de alta un Folder es necesario escribir el nombre del folder y despues el usuario da click en un boton que dice buscar, el boton debería abrir una ventana donde despliega la lista de autores que previamente hemos agregado, entonces se selecciona uno y se puede dar de alta un Folder.
El problema es que al dar click en buscar autor la aplicación falla y aparece el siguiente mensaje:
Código:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at mx.uam.ayd.negocio.ControlAgregarFolder.buscarAutor(ControlAgregarFolder.java:31)
at mx.uam.ayd.presentacion.VentanaAltaFolder$1.actionPerformed(VentanaAltaFolder.java:114)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6525)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6290)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4881)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
at java.awt.Container.dispatchEventImpl(Container.java:2278)
at java.awt.Window.dispatchEventImpl(Window.java:2750)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Anteriormente teniamos la misma aplicacion pero las clases se llamaban Libros, solamente ajustamos los nombre y quitamos un campo que no necesitamos y al correr la aplicación esta fallando. El flujo es mas o menos el siguiente:
EL boton que dispara la accion para desplegarla ventana con autores es el siguiente:
Código
/** * This method initializes jButtonBuscarAutor * * @return javax.swing.JButton */ if (jButtonBuscarAutor == null) { jButtonBuscarAutor.setText("Buscar"); autor = control.buscarAutor(); if(autor != null) { jLabelNombreAutor.setText(autor.toString()); //Muestra el nombre del autor actualmente seleccionado } } }); } return jButtonBuscarAutor; }
Y la clase control tiene el siguiente código:
Código
public class ControlAgregarFolder { private DAOFolder DAOFolders;//libreria private DAOAutor DAOautores; private VentanaAltaFolder VentanaFolder; public ControlAgregarFolder(DAOFolder DAOFolders, DAOAutor autores) { this.DAOFolders = DAOFolders; this.DAOautores = autores; } public void inicia() { VentanaFolder = new VentanaAltaFolder(this); VentanaFolder.setVisible(true); } public Autor buscarAutor() { //En la siguiente linea el programa esta fallando, cuando ejecuta DAOautores.dameAutores() Autor arregloAutores[] = DAOautores.dameAutores(); // Obtiene lista de autores // Crea el dialogo con la lista de autores dialogo.setVisible(true); // Muestra el dialogo return dialogo.getAutorSeleccionado(); // Regresa el autor seleccionado en el dialogo } DAOFolders.agregaFolder(new Folder(nombre,autor,ruta)); } }
Y donde se supone que esta fallando es en la linea que hace referencia al DAOAutor cuyo codigo es:
Código
public Autor[] dameAutores() { try { // Crea el statement // Recibe los resutados while(rs.next()) { // Crea una nueva instancia del objeto Autor autor = new Autor(rs.getString("nombre"),rs.getString("apellido")); autoresTemp.add(autor); } Autor autoresTempArreglo[]=new Autor[autoresTemp.size()]; autoresTemp.toArray(autoresTempArreglo); return autoresTempArreglo; // TODO Auto-generated catch block e.printStackTrace(); return null; } }
edito: conseguimos resolver el problema comenzando desde cero, no supe porque daba el error. En los DAO algunos métodos regresaban null si fallaba algo en la conexion o las sentencias de SQL, imaginé que por ahi estaba el problema.
Saludos