我有一个连接到MySQL数据库的简单登录屏幕。它连接得很好,但它在尝试执行时抛出一个空指针异常。这是我的代码的两个片段以及堆栈跟踪。我用粗线表示抛出异常的行。
package GUI;
import java.sql.*;
import javax.swing.JOptionPane;
import java.awt.event.*;
public class LogInFrame extends javax.swing.JFrame
{
Connection con;
Statement st;
ResultSet rs;
// Login Constructor
public LogInFrame()
{
connect();
initComponents();
setLocationRelativeTo(null);
}
public void connect(){
try
{
con = DriverManager.getConnection(
"jdbc:mysql://instance44668.db.xeround.com:5719/obliquedb?"
+ "user=NAME2&password=PASS");
}
catch (SQLException ex)
{
System.err.println("Cannot connect to database server");
System.err.println(ex.getMessage());
}
finally
{
try
{
con.close();
}
catch (SQLException ex)
{
System.out.println("Better luck next time");
}
}
}
这是执行语句
的方法private void acceptButtonActionPerformed(java.awt.event.ActionEvent evt)
{
try
{
String user = userTextField.getText().trim();
char[] password = passwordTextField.getPassword();
String pass = new String(password);
String query = "SELECT username,password FROM users WHERE username = '"+user+"'and password = '"+pass+"'";
EXCEPTION THROWN-**rs = st.executeQuery(query);**
int count = 0;
while(rs.next())
{
count++;
}
if(count == 1) {
JOptionPane.showMessageDialog(this,
"Login Successful",
"Error Message", JOptionPane.ERROR_MESSAGE);
}
else if(count > 1) {
JOptionPane.showMessageDialog(this,
"Duplicate Records Found!",
"Error Message", JOptionPane.ERROR_MESSAGE);
}
else {
JOptionPane.showMessageDialog(this,
"User Not Found",
"Error Message", JOptionPane.ERROR_MESSAGE);
}
}
catch (Exception e) {
System.out.println("Error Retrieving Records" + e);
}
}
和堆栈跟踪
Error Retrieving Recordsjava.lang.NullPointerException
java.lang.NullPointerException
at GUI.LogInFrame.acceptButtonActionPerformed(LogInFrame.java:178)
at GUI.LogInFrame.access$000(LogInFrame.java:7)
at GUI.LogInFrame$1.actionPerformed(LogInFrame.java:94)
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)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2713)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:680)
at java.awt.EventQueue$4.run(EventQueue.java:678)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
答案 0 :(得分:1)
在connect
中,连接立即关闭。
声明最好应该是PreparedStatement(具有其他优点)。
所以也要在connect中创建语句并删除finally。
在应用程序退出时调用disconnect
关闭语句和连接。
结果集rs
也应该接近。
String query = "SELECT username,password "
+ "FROM users "
+ "WHERE BINARY username = ? "
+ "AND BINARY password = ?";
对于区分大小写的比较,要么为列指定二进制排序规则, 或使用BINARY。
可以更恰当地处理密码,但正如我们所说的桌面 申请没关系。