连接数据库java.lang.nullPointerException的错误如何解决?

seeland 2005-01-22 11:18:27
刚才结贴结错了,重发一贴;

小弟是初学者,在连接数库超老是报错
系统环境:
win2000
JBuilder9
SQL Server2000



代码:

package card;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

import javax.swing.event.*;
import java.sql.*;

public class loginFrame extends JFrame {
JPanel contentPane;


private String CardID;
private String loginQuery;
private String passwordtemp;
private PreparedStatement loginStmt;
private Connection con;
private ResultSet rs;

........

JTextField jTextField1 = new JTextField();
JPasswordField jPasswordField1 = new JPasswordField();

public loginFrame() {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}

private void jbInit() throws Exception {
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(null);
.......

jTextField1.setText("");
jTextField1.setBounds(new Rectangle(177, 102, 105, 22));
jPasswordField1.setBounds(new Rectangle(178, 142, 107, 22));

contentPane.add(jPasswordField1, null);
contentPane.add(jTextField1, null);






// join sql server2000
Connection con=cardConnect.getconn();
//建立对象,直接调用cardConnect的方法
loginQuery="Select * from [dbo].card where CardID=? and UserID=?";

PreparedStatement loginStmt = con.prepareStatement(loginQuery);
}
//Overridden so we can exit when window is closed
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}

void jButton1_actionPerformed(ActionEvent e) {

try{
CardID = jTextField1.getText(); //提取Card值
try{
loginStmt.setString(1,CardID);
}catch(Exception ex)
{
System.out.println(CardID+" "+ex);
}


finally{

cardConnect.close(rs);
cardConnect.close(loginStmt);
cardConnect.close(con);
}


}
}









package card;
import java.sql.*;


public class cardConnect {
public cardConnect() {
try{

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

}
catch(ClassNotFoundException ee){
}
}


public static Connection getconn() throws SQLException{

String url="jdbc:microsoft:sqlserver://192.168.1.4:1433;DatabaseName=java_test";
String username="sa";
String password="";

return DriverManager.getConnection(url,username,password);

}
public static void close(ResultSet rs){
try{
rs.close();
}
catch(Exception ex){
}
}

public static void close(Statement stmt){
try{
stmt.close();
}
catch(Exception ex){
}

}

public static void close(Connection conn){
try{
conn.close();
}
catch(Exception ex){
}
}

private static cardConnect dbconn=new cardConnect();



}




当触发这个事件的时侯:jButton1_actionPerformed(ActionEvent e)
报java.lang.nullPointerException的错误


java.lang.NullPointerException
at card.loginFrame.jButton1_actionPerformed(loginFrame.java:112)
at card.loginFrame_jButton1_actionAdapter.actionPerformed(loginFrame.java:179)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1764)
at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1817)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:419)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:257)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:245)
at java.awt.Component.processMouseEvent(Component.java:5134)
at java.awt.Component.processEvent(Component.java:4931)
at java.awt.Container.processEvent(Container.java:1566)
at java.awt.Component.dispatchEventImpl(Component.java:3639)
at java.awt.Container.dispatchEventImpl(Container.java:1623)
at java.awt.Component.dispatchEvent(Component.java:3480)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3450)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3165)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3095)
at java.awt.Container.dispatchEventImpl(Container.java:1609)
at java.awt.Window.dispatchEventImpl(Window.java:1590)
at java.awt.Component.dispatchEvent(Component.java:3480)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:450)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:197)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:144)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:136)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:99)


这种错误怎么解决 谢谢!



...全文
408 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zealVampire 2005-01-22
  • 打赏
  • 举报
回复
void jButton1_actionPerformed(ActionEvent e) {
}
你每次执行这个动作都再finally都把连接关掉了
所以再次动作点击就出错了

去掉finally应该可以 不过你要注意一下资源的释放
GJA106 2005-01-22
  • 打赏
  • 举报
回复
PreparedStatement和ResultSet在每次操作完成之后应该close掉,再次使用时可以从connection中取。
seeland 2005-01-22
  • 打赏
  • 举报
回复
按你的"zealVampire(白鹤泉之*) " 改好了
但现在又有一个问题,我第一次连接成功,我重新执行"jButton1_actionPerformed(ActionEvent e) 时报:
ava.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Object has been closed.

at java.awt.Window.dispatchEventImpl(Window.java:1590)

at java.awt.Component.dispatchEvent(Component.java:3480)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:450)

at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:197)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:144)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:136)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:99)

报数据库已经关闭连接,
我应该怎么布局才不会报这种错误!


全部代码如下:



package card;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

import javax.swing.event.*;
import java.sql.*;
//import java.sql.SQLException;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/

public class loginFrame extends JFrame {
JPanel contentPane;


private int CardID;
private String loginQuery;
private String passwordtemp;
private PreparedStatement loginStmt;
private Connection con;
private ResultSet rs;
JButton jButton1 = new JButton();
JButton jButton2 = new JButton();
JLabel jLabel1 = new JLabel();
JLabel jLabel2 = new JLabel();
JLabel jLabel3 = new JLabel();
JTextField jTextField1 = new JTextField();
JPasswordField jPasswordField1 = new JPasswordField();

//Construct the frame
public loginFrame() {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
//Component initialization
private void jbInit() throws Exception {
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(null);
this.setSize(new Dimension(400, 300));
this.setTitle("欢迎光临");

jButton1.setBounds(new Rectangle(101, 211, 73, 25));
jButton1.setText("登陆");
jButton1.addActionListener(new loginFrame_jButton1_actionAdapter(this));
jButton2.setBounds(new Rectangle(201, 208, 73, 25));
jButton2.setText("重置");
jLabel1.setFont(new java.awt.Font("Dialog", 1, 38));
jLabel1.setText("欢迎访问信用卡系统");
jLabel1.setBounds(new Rectangle(4, 7, 390, 74));
jLabel2.setFont(new java.awt.Font("Dialog", 1, 20));
jLabel2.setText("卡号:");
jLabel2.setBounds(new Rectangle(96, 94, 60, 34));
jLabel3.setFont(new java.awt.Font("Dialog", 1, 20));
jLabel3.setText("密码:");
jLabel3.setBounds(new Rectangle(99, 138, 52, 31));
jTextField1.setText("");
jTextField1.setBounds(new Rectangle(177, 102, 105, 22));
jPasswordField1.setBounds(new Rectangle(178, 142, 107, 22));

contentPane.add(jButton1, null);
contentPane.add(jLabel1, null);
contentPane.add(jPasswordField1, null);
contentPane.add(jTextField1, null);
contentPane.add(jLabel2, null);
contentPane.add(jLabel3, null);
contentPane.add(jButton2, null);






// join sql server2000
//Connection con=cardConnect.getconn();
//con=cardConnect.getconn();
con = cardConnect.getconn();
//建立对象,直接调用cardConnect的方法
loginQuery="Select * from [dbo].card where CardID=? and UserID=?";
try{
loginStmt = con.prepareStatement("Select * from [dbo].card where CardID=? and UserID=?");
}
catch(Exception ex){
System.out.println(ex);
}
}
//Overridden so we can exit when window is closed
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}

void jButton1_actionPerformed(ActionEvent e) {

try{
CardID = Integer.parseInt(jTextField1.getText()); //提取Card值
System.out.println("test...............Integer.parseInt(jTextField1.getText())");

try{
loginStmt.setInt(1,CardID);
}catch(Exception ex)
{
System.out.println(CardID+" "+ex);
ex.printStackTrace();

}
//loginStmt.setString(1,CardID);
//loginStmt.setString(1, CardID); //给第一个主机变量赋值
passwordtemp = "";
for (int i = 0; i < jPasswordField1.getPassword().length; i++) {
passwordtemp += jPasswordField1.getPassword()[i];
}

try{
loginStmt.setString(2, passwordtemp);
}catch(Exception ex)
{
System.out.println("passwordtemp............."+ex);
}

try{

rs = loginStmt.executeQuery();
}catch(Exception ex)
{
System.out.println("rs.............."+ex);
}

try{


if (rs.next()) {
}
else {
jTextField1.setText("卡号或密码错误. ");
jPasswordField1.setText("");
}
}catch(Exception ex)
{
System.out.println(ex);
}

}catch(Exception ex)
{
System.out.println(""+ex);
}

finally{

cardConnect.close(rs);
cardConnect.close(loginStmt);
cardConnect.close(con);
}


}
}

class loginFrame_jButton1_actionAdapter implements java.awt.event.ActionListener {
loginFrame adaptee;

loginFrame_jButton1_actionAdapter(loginFrame adaptee) {
this.adaptee = adaptee;

}
public void actionPerformed(ActionEvent e) {
adaptee.jButton1_actionPerformed(e);
}
}
zealVampire 2005-01-22
  • 打赏
  • 举报
回复
private void jbInit() throws Exception {
contentPane = (JPanel) this.getContentPane();
contentPane.setLayout(null);
.......

jTextField1.setText("");
jTextField1.setBounds(new Rectangle(177, 102, 105, 22));
jPasswordField1.setBounds(new Rectangle(178, 142, 107, 22));

contentPane.add(jPasswordField1, null);
contentPane.add(jTextField1, null);






Connection con=cardConnect.getconn();//去掉Connection啊 怎么又定义一个con呢?
--------------------------------------
改为
cardConnect connCardCard =new cardConnect();//你必须线初始化的啊
con = conn.getConnection() ;


===========================================================================
loginQuery="Select * from [dbo].card where CardID=? and UserID=?";

PreparedStatement loginStmt = con.prepareStatement(loginQuery);//去掉PreparedStatement
}
zealVampire 2005-01-22
  • 打赏
  • 举报
回复

你去掉private static cardConnect dbconn=new cardConnect();

private void jbInit() throws Exception {


cardConnect connCardCard =new cardConnect();//你必须线初始化的啊
//因为你直接调用静态方法getConenction的话 没进行Class.forName()
con = conn.getConnection() //这里你不要再写一个Connection con=..什么了

因为你已经定义了Private Connection con;了
你一直使用这个private 的con就可以了


}
zealVampire 2005-01-22
  • 打赏
  • 举报
回复
呵呵 不会白接你的分的
看看你点击jb的异常 具体是那一行抛NllPointException 的呢?
private static cardConnect dbconn=new cardConnect();

不是这样添加的!!!。。
seeland 2005-01-22
  • 打赏
  • 举报
回复
我按 zealVampire(白鹤泉之*) 说得修改过亚,问题没有解决


/****************************************************************8
回复人: zealVampire(白鹤泉之*) ( ) 信誉:98 2005-1-22 10:22:31

Connection con=cardConnect.getconn();
你是通过static方法得到连接的 这样是错的!
因为你

public cardConnect() {
try{

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

}
catch(ClassNotFoundException ee){
}
}
你应该这样
cardConnect conn =new cardConnect();
之后conn.getConnection()
或者把Class.forName放到getConenction方法里面



50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧