【问题标题】:JDBC ODBC.. (Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException)JDBC ODBC ..(线程“AWT-EventQueue-0”java.lang.NullPointerException 中的异常)
【发布时间】:2011-02-03 23:44:00
【问题描述】:
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:
}                                        

这是我的插入模块。这适用于我朋友的笔记本电脑。但不是在我的:( 我收到以下错误:

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

PS:我对 java 完全陌生。是不是我的 ODBC 有问题?

在构造函数中创建连接(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");
    }
}

【问题讨论】:

  • 现在添加您创建连接的代码
  • 上面代码的第197行是哪一行?
  • p1 = conn.prepareStatement(s1);这是第 197 行
  • @enthu:所以当你调用 conn 时它是空的。
  • 但在构造函数中,当我调用 getConnection 时,conn 为 != null。我得到对话框说“已连接”..(请查看我的连接代码)

标签: java jdbc scope


【解决方案1】:

编辑:您仍然没有指出问题中的第 197 行,但我假设它是

p1 = conn.prepareStatement(s1);

这几乎可以肯定是由于构造函数的这一点:

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

这声明了一个名为conn本地 变量。大概你还有一个名为conninstance 变量,但是局部变量隐藏了它。您正在分配给局部变量,这意味着实例变量将保持其默认值 null。你的意思可能只是:

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

但是,如果发生异常,您不应该只打印“错误”并继续运行...您可能应该从构造函数中抛出异常。毕竟,除非您有数据库连接,否则实例不会正常运行。

您还应该考虑仅在实际需要时创建数据库连接,然后立即关闭它。在适当的情况下使用连接池来提高效率。


原答案

您没有显示引发异常的代码位 - 即jButton1ActionPerformed,第 197 行是罪魁祸首。你已经向我们展示了jButton3ActionPerformed

向我们展示正确的代码和行号,我们更有可能有机会帮助您。或者只看一下第 197 行使用的内容 - 某些内容会导致您尝试取消引用的空引用,例如

int foo = someNullValue.getIntValue();

这可能是方法调用的结果,例如

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

顺便说一句,在 UI 线程中执行数据库工作通常不是一个好主意 - 尽管作为初学者,在数据库访问期间正确处理并忍受 UI 挂起可能比正确处理多线程更简单.不过,当您有更多经验时,您应该考虑在以后适当地穿线。

【讨论】:

  • 私人无效 jButton1ActionPerformed(java.awt.event.ActionEvent evt) { PreparedStatement p1;尝试 { System.out.println("works");字符串 s1="插入 reg(num,name) 值(?,?)"; p1 = conn.prepareStatement(s1);// 第 197 行 JOptionPane.showMessageDialog(this, "Statement Prepared"); p1.setString(1,num.getText()); p1.setString(2, name.getText()); p1.executeUpdate(); } catch (SQLException ex) { Logger.getLogger(sample.class.getName()).log(Level.SEVERE, null, ex); jbutton1 和 jbutton2 都执行相同的任务。所以错误地复制了代码。
  • @enthudrives:请编辑您的问题,而不是在评论中添加代码。在评论中基本上是不可读的。
【解决方案2】:

异常形式 jButton1ActionPerformed 函数不在 jButton3ActionPerformed 中,

确保 Connection 对象具有价值并且您已经连接到数据库。

【讨论】:

  • 公共样本() { initComponents();尝试 { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch(ClassNotFoundException ex) { JOptionPane.showMessageDialog(this, "Error!"); } 尝试 { Connection conn=DriverManager.getConnection("jdbc:odbc:reg","system","passwd"); if(conn!=null) JOptionPane.showMessageDialog(this, "Connected!"); } catch(SQLException ex) { System.out.println("错误"); } } 我的连接已建立
  • 当构造函数结束时,你的连接是在构造函数内部定义的,那么你的引用已经失效,所以在构造函数之外定义连接
猜你喜欢
  • 1970-01-01
  • 2012-07-21
  • 2013-12-09
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多