我使用的是MVC设计模式,而且我是设计模式和java的完全初学者。 如果我没有把LoginModel登录= new LoginModel());将弹出java.lang.nullPointerException。但是,当我把它,这个java.lang.StackOverflowError发生。 我不确定是否提供足够的详细信息,但如果您需要更多信息,请提及,我会提供更多详细信息。
public class LoginModel {
private String userName;
private int id;
private String email;
private long startTime;
private long endTime;
Timer timer;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
Connection conn = null;
ResultSet rs = null;
PreparedStatement pst = null;
LoginModel login = new LoginModel(); //this is where the error happens
public LoginModel(){}
public LoginModel(int id,String userName,String email){
this.id=id;
this.userName=userName;
this.email=email;
}
public int getID(){
return id;
}
public String getUserName(){
return userName;
}
public String getEmail(){
return email;
}
public void setStartTime(long time){
startTime=time;
}
public void setEndTime(long time){
endTime = time;
}
public long getUsedTime(){
return (endTime-startTime);
}
public LoginModel(int seconds) {
timer = new Timer();
timer.schedule(new LoginModel.RemindTask(), seconds*1000);
}
public void setTimer(int seconds){
timer = new Timer();
timer.schedule(new LoginModel.RemindTask(), seconds*1000);
}
class RemindTask extends TimerTask {
public void run() {
JOptionPane.showMessageDialog(null, "60 seconds left!");
timer.cancel();
}
}
public void RetrieveDbase (Connection conn){
String sql = "SELECT * FROM customer_info WHERE username = ? and password = ?";
String sql2 = "SELECT * FROM admin_info WHERE username = ? and password = ?";
String sql11 = "SELECT * FROM customer_info WHERE username = ? and password = ? and paidRemainingTime != 0";
try{
pst = conn.prepareStatement(sql);
pst.setString(1, jTextField1.getText());
pst.setString(2, jTextField2.getText());
rs = pst.executeQuery();
if (rs.next()){
JOptionPane.showMessageDialog(null, "Welcome "+jTextField1.getText());
try{
pst = conn.prepareStatement(sql11);
pst.setString(1, jTextField1.getText());
pst.setString(2, jTextField2.getText());
rs = pst.executeQuery();
if (rs.next()){
new dummyHomepage().setVisible(true);
//this.setVisible(false);
JOptionPane.showMessageDialog(null,"Your Paid Time Remains "
+ rs.getInt("paidRemainingTime")+"Minutes");
login.setTimer(rs.getInt("paidRemainingTime"));
long startTime = System.currentTimeMillis( );
login.setStartTime(startTime);
}
else{
new PurchaseInterface().setVisible(true);
//this.setVisible(false);
}
}
catch (Exception e){
JOptionPane.showMessageDialog(null, e);
}
}
else
try{
pst = conn.prepareStatement(sql2);
pst.setString(1, jTextField1.getText());
pst.setString(2, jTextField2.getText());
rs = pst.executeQuery();
if (rs.next()){
JOptionPane.showMessageDialog(null, "Welcome ADMIN "+jTextField1.getText());
new ManageUserInterface().setVisible(true);
//this.setVisible(false);
}
else
JOptionPane.showMessageDialog(null, "Invalid username and password");
}
catch (Exception e){
JOptionPane.showMessageDialog(null, e);
}
}
catch (Exception e){
JOptionPane.showMessageDialog(null, e);
}
}
public Connection getDbase(){
return conn;
}
}
答案 0 :(得分:1)
您的通话LoginModel login = new LoginModel();
会产生StackOverflowError
,因为它是递归的。当您尝试创建LoginModel
时,它会为LoginModel
实例变量创建另一个login
,从而为创建另一个LoginModel
{{1实例变量等等。
login
实例变量的目的是什么?如果它只是删除login
,那么它就不起作用了。它只是掩盖它。删除它并尝试其他方法来调试NullPointerException
。
NullPointerException
的原因可能是因为您的代码中都没有设置这些实例变量。
答案 1 :(得分:1)
LoginModel login = new LoginModel();
在这种情况下, login
是一个成员变量,这意味着它将为LoginModel
类型的每个新对象创建。
由于创建LoginModel
对象会创建成员变量login
,这是一个LoginModel
,它会创建一个login
的成员变量LoginModel
。你有问题。