2013-05-02 35 views
0

我正在使用MVC设计模式,并且我是设计模式和java的完整初学者。 如果我没有把LoginModel login = new LoginModel()); java.lang.nullPointerException将弹出。但是当我把它,这个java.lang.StackOverflowError发生。 我不知道,如果我给足够的细节,但如果你需要更多的,只是提了,我会提供更多的细节..如何解决MVC设计模式中的java.lang.StackOverflowError(加上mySQL)

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

递归'新的LoginModel()'。你有一个实例字段'LoginModel login'。当你创建一个新的LoginModel时,它会创建一个新的LoginModel,令人生厌。 – 2013-05-02 18:37:20

回答

1

您的通话LoginModel login = new LoginModel();产生StackOverflowError,因为它是递归的。当您尝试创建LoginModel时,它会为login实例变量创建另一个LoginModel,该实例变量将为另一个LoginModel创建login实例变量,依此类推。

login实例变量的用途是什么?如果只是删除NullPointerException,那么它不起作用。这只是掩盖它。删除它并尝试其他方法来调试NullPointerException

NullPointerException的原因可能是因为您的代码中没有设置这些实例变量。

  • jTextField1
  • jTextField2中
1
LoginModel login = new LoginModel(); 

login是在这种情况下,这意味着,它会为类型LoginModel的每一个新的对象被创建的成员变量。

由于制作LoginModel对象创建成员变量login这是一个LoginModel,它创建了一个成员变量login这是一个LoginModel ......你有问题。