Java – JDBC ODBC.. (Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException)

javajdbcscope

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
  PreparedStatement p1;
   try {
       System.out.println("works");
       String s1="insert into reg(num,name) values(?,?)";
      p1 = conn.prepareStatement(s1);
      System.out.println("Works");
      JOptionPane.showMessageDialog(this, "Statement prepared");

   p1.setString(1,num.getText());
   p1.setString(2, name.getText());
   p1.executeUpdate();
   JOptionPane.showMessageDialog(this, "Inserted");
    }
 catch (SQLException ex) {
 JOptionPane.showMessageDialog(this, "NOT Inserted");
        Logger.getLogger(sample.class.getName()).log(Level.SEVERE, null, ex);
    }

    // TODO add your handling code here:
}                                        

This is my insert module.. This works in my friend's laptop. But not in mine 🙁
I get the following error:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at sample.jButton1ActionPerformed(sample.java:197)
at sample.access$200(sample.java:20)
at sample$3.actionPerformed(sample.java:92)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Java Result: 1

PS: I am totally new to java. Is it a problem with my ODBC?

Created connection in the constructor(sample()):

public sample() {
    initComponents();
    try
    {
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    }
    catch(ClassNotFoundException ex)
    {
       JOptionPane.showMessageDialog(this, "Error!");
    }


    try
    {
    Connection conn=DriverManager.getConnection("jdbc:odbc:reg","system","suganthi");
    if(conn!=null)
    JOptionPane.showMessageDialog(this, "Connected!");
    }
    catch(SQLException ex)
    {

        System.out.println("Error");
    }
}

Best Answer

EDIT: You still haven't indicated which is line 197 in the question, but I'll assume it's

p1 = conn.prepareStatement(s1);

This is almost certainly due to this bit of the constructor:

Connection conn=DriverManager.getConnection("jdbc:odbc:reg","system","suganthi");

This declares a local variable called conn. Presumably you also have an instance variable called conn, but the local variable is hiding it. You're assigning to the local variable, which means the instance variable is going to keep its default value of null. You probably meant just:

conn = DriverManager.getConnection("jdbc:odbc:reg","system","suganthi");

However, if an exception occurs you shouldn't just print "Error" and keep going... you should probably throw an exception from the constructor instead. After all, the instance isn't going to behave properly unless you've got a database connection.

You should also consider only creating a database connection when you actually need it, and closing it immediately afterwards. Use a connection pool to allow this to be efficient where appropriate.


Original answer

You haven't shown the bit of code which is throwing the exception - namely jButton1ActionPerformed, with line 197 being the culprit. You've shown us jButton3ActionPerformed instead.

Show us the right piece of code, with line numbers, and we're more likely to have a chance to help you. Or just look at what's being used on line 197 - something there is resulting in a null reference which you're trying to dereference, e.g.

int foo = someNullValue.getIntValue();

It may be the result of a method call though, e.g.

foo().getIntValue(); // Will throw if `foo()` returns null

As an aside, doing database work in the UI thread isn't generally a good idea - although as you're a beginner it may be simpler to get that right and live with the UI hanging during database access than getting multithreading right. You should consider threading it properly at a later date though, when you have more experience.