elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Java y Derby - SQL "insert" error
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Java y Derby - SQL "insert" error  (Leído 1,151 veces)
Cr4id3r

Desconectado Desconectado

Mensajes: 88



Ver Perfil
Java y Derby - SQL "insert" error
« en: 10 Marzo 2015, 19:48 pm »

Buenas de nuevo comunidad, ya estoy por aquí de nuevo ;)
Vereis estoy realizando una interfaz gráfica para grabar datos en una base de datos embedidad en una aplicación java, el problema es que estoy teniendo un problemas a la hora de realizar un insert en la tabla y me da que se me ha pasado algo pero no consigo encontrar el que :S

Creación de Base de Datos si no existe

Código:
public class DerbInterfaz {
        public final String DRIVER = "org.apache.derby.jdbc.EmbeddedDriver";
        public final String JDBC_URL = "jdbc:derby:zadb;create=true";
        public final String SQL_STATEMENT = "select * from citas";
        public Statement statement;
        public void conexion() throws ClassNotFoundException, SQLException {
        Class.forName(DRIVER);
        Connection connection = DriverManager.getConnection(JDBC_URL);
        Statement statement = connection.createStatement();
        try{
            ResultSet resultSet = statement.executeQuery(SQL_STATEMENT);
        }catch(SQLException e){
            connection.createStatement().execute("CREATE TABLE citas(nombre varchar(20),apellidos varchar(20), dia varchar(20), hora varchar(20), motivo varchar(255))");
            ResultSet resultSet = statement.executeQuery(SQL_STATEMENT);
        }
    }
}




Insercción de Datos

Código:
public class saveData {
    derbinterfaz.DerbInterfaz bd = new derbinterfaz.DerbInterfaz();
    public void registrar_datos(){
        try{
            bd.conexion();
            bd.statement.execute("INSERT INTO citas(nombre, apellidos, dia, hora, motivo)VALUES('ad','ad','ad','ad','ad')");
        }catch(ClassNotFoundException | SQLException e){
            JOptionPane.showMessageDialog(null, "No se han podido guardar los datos","Error",JOptionPane.PLAIN_MESSAGE);
        }
    }
}


He añadido la acción de registrar_datos en un botón de la interfaz grafica. Pero cuando pulso el botón me salta el siguiente error.

Error

Código:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at derbinterfaz.saveData.registrar_datos(saveData.java:11)
at derbinterfaz.interfaz.jButton1ActionPerformed(interfaz.java:130)
at derbinterfaz.interfaz.access$100(interfaz.java:5)
at derbinterfaz.interfaz$2.actionPerformed(interfaz.java:54)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
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:6505)......


EDITO!

El problema me esta viniendo porque a la hora de realizar el comando SQL insert estoy llamando a un Statement vacío, por algun motivo cuando llamo a la función conexion() no me sobreescribe la variable statement declarada en el inicio :S


« Última modificación: 10 Marzo 2015, 21:06 pm por Cr4id3r » En línea

Vive solo por lo que estas dispuesto a morir.
Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Java y Derby - SQL "insert" error
« Respuesta #1 en: 10 Marzo 2015, 23:40 pm »

La VM lanza una NullPointerException cuando se intecta acceder a un objeto que no tiene referencia, es decir que no apuntada a nada, y que como sabemos la VM le asigna el valor null.

La VM inicializa todos los objetos con null si el programador no los ha inicialozado. En tu caso, DerbInterfaz tiene una propiedad tipo Statement que debe ser inicalizada.

El problema se genera porque el método conexion declara una variable local llamada exactamente como la propoedad Statement, la cual oculta la propiedad, como resultado, la propiedad statement nunca es inicializada porque el metodo conexion declara una nueva.

Entonces, como la propiedad statement nunca es inicializada, vale null y cuando tu tratas de acceder al método createStatement la VM lanza la excepción.

Para solucionar tu problema solo debes remover Statement del método conexion. Tu método quedaría así:

Código
  1. public void conexion() throws ClassNotFoundException,SQLException {
  2.    Class.forName(DRIVER);
  3.    Connection connection = DriverManager.getConnection(JDBC_URL);
  4.    try (statement = connection.createStatement()) {
  5.        ResultSet resultSet = statement.executeQuery(SQL_STATEMENT);
  6.    }catch(SQLException e){
  7.        connection.createStatement().execute("CREATE TABLE citas(nombre varchar(20),apellidos varchar(20), dia varchar(20), hora varchar(20), motivo varchar(255))");
  8.        ResultSetresultSet = statement.executeQuery(SQL_STATEMENT);
  9.    }
  10. }

Recuerda siempre cerrar conexiones y flujos, es estrictamente necesario.


« Última modificación: 11 Marzo 2015, 19:57 pm por Gus Garsaky » En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines