2017-08-08 69 views
0

我正在开发一个需要登录功能的项目,而且我几乎已经完成了所有工作,并且一直工作到最终检查。无明显原因设置为空的变量

因此,在handleLogin事件下,JavaFX GUI接收用户名和密码的输入,该用户名和密码首先存储在GertLogin类的userU和userP中。然后,输入的用户名将与DBMod的getData方法中的数据库中存在的可用用户名交叉引用。此方法返回与用户输入的用户名相对应的用户名和密码,并将其存储在GetLogin类的dbU和dbP中。那么应该发生什么是两个密码进行比较,如果它们匹配,则登录成功。

但是,在完成getData方法和调用checkData方法之间,变量dbU和dbP都设置为null,并且当userU和userP都存储得很好时,我无法找到它们会做什么的位置或原因。

任何人都可以看到这到底发生了什么,为什么?

首页FXMLController:

package estorage; 

import java.io.IOException; 
import java.net.URL; 
import java.util.ResourceBundle; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.fxml.Initializable; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.PasswordField; 
import javafx.scene.control.TextField; 
import javafx.scene.input.MouseEvent; 
import javafx.stage.Stage; 

public class HomeController implements Initializable { 

    String username; 
    String password; 
    GetLogin login = new GetLogin(username, password); 

    @FXML 
    private Label registerPane; 
    @FXML 
    private Button btnLogin; 
    @FXML 
    private TextField txtUsername; 
    @FXML 
    private PasswordField txtPassword; 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // TODO 
    }  

    @FXML 
    private void handleRegisterScreen(MouseEvent event) { 
     try { 
      FXMLLoader fxmlLoader = new FXMLLoader(); 
      fxmlLoader.setLocation(getClass().getResource("Register.fxml")); 

      Scene scene = new Scene(fxmlLoader.load()); 
      Stage stage = new Stage(); 

      stage.setScene(scene); 
      stage.show(); 
      ((Node)(event.getSource())).getScene().getWindow().hide(); 
     } 
     catch (IOException e) { 
      Logger logger = Logger.getLogger(getClass().getName()); 
      logger.log(Level.SEVERE, "Failed to cretae new window", e); 
     } 
    } 

    @FXML 
    private void handleLogin(ActionEvent event) { 
     username = txtUsername.getText(); 
     password = txtPassword.getText(); 
     login.userDetails(username, password); 
     login.getDBDetails(username); 
     login.getDetails(); 
     login.checkData(); 
    } 

DBMOD类:

package estorage; 

import java.sql.*; 

public class DBMod { 
    static final String JDBC_DRIVER = "com.exasol.jdbc.EXADriver"; 
    static final String DB_URL = "jdbc:exa:192.168.56.101"; 
    static final String USER = "sys"; 
    static final String PASS = "exasol"; 

    //Add Entry to Database Method 
    public void Add(String f, String l, String p, String u) { 
     Connection con = null; 
     PreparedStatement st = null; 
     try { 
      //Register JDBC driver 
      Class.forName("com.exasol.jdbc.EXADriver"); 

      //Open connection 
      System.out.println("Connecting to a selected database..."); 
      con = DriverManager.getConnection(DB_URL, USER, PASS); 
      System.out.println("Connected database successfully..."); 

      //Execute a Query 
      System.out.println("Adding details..."); 
      String insert = "INSERT INTO ES.USERS (firstname, lastname, username, password)" + 
         "VALUES (?, ?, ?, ?)"; 
      st = con.prepareStatement(insert); 
      st.setString(1, f); 
      st.setString(2, l); 
      st.setString(3, u); 
      st.setString(4, p); 
      st.executeUpdate(); 


      //Extract all records & Update 
      insert = "SELECT * FROM ES.USERS"; 
      ResultSet rs = st.executeQuery(insert); 

      while(rs.next()) { 
       //Retrive data by column name 
       int id = rs.getInt("id"); 
       String firstName = rs.getString("firstname"); 
       String lastName = rs.getString("lastname"); 
       String username = rs.getString("username"); 
       String password = rs.getString("password"); 

       //Display values 
       System.out.print("ID: " + id); 
       System.out.print(", First Name: " + firstName); 
       System.out.print(", Last Name: " + lastName); 
       System.out.print(", Username: " + username); 
       System.out.println(", Password: " + password); 
      } 
      rs.close(); 
     } 

     catch (SQLException se){ 
      se.printStackTrace(); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
     finally { 
      try { 
       if(st != null) 
        con.close();    
      } 
      catch(SQLException se) { 

      } 
      try { 
       if(con != null) 
        con.close(); 
      } 
      catch(SQLException se) { 
       se.printStackTrace(); 
      } 

     } 

    } 

    //Get data from Database method 
    public void getData(String u) { 
     String username = null; 
     String password = null; 
     GetLogin details = new GetLogin(username, password); 
     Connection con = null; 
     PreparedStatement st = null; 
     try { 
      //Register JDBC driver 
      Class.forName("com.exasol.jdbc.EXADriver"); 

      //Open connection 
      System.out.println("Connecting to a selected database..."); 
      con = DriverManager.getConnection(DB_URL, USER, PASS); 
      System.out.println("Connected database successfully..."); 

      //Execute a Query 
      System.out.println("Retrieving details..."); 
      String data = "SELECT USERNAME, PASSWORD FROM ES.USERS WHERE USERNAME = ?"; 
      st = con.prepareStatement(data); 
      st.setString(1, u); 
      ResultSet rs = st.executeQuery(); 

       while(rs.next()) { 
       //Retrive data by column name 
       username = rs.getString("USERNAME"); 
       password = rs.getString("PASSWORD"); 

       //Display values 
       System.out.println(); 
       System.out.println(); 
       System.out.println(); 
       System.out.println(); 
       System.out.println(); 
       System.out.println("Send to method"); 
       details.DBDetails(username, password); 
       System.out.println(username); 
       System.out.println(password); 
       System.out.println("End DB Method"); 
       System.out.println(); 
       System.out.println(); 
       System.out.println(); 
       System.out.println(); 


      } 
      rs.close(); 
      System.out.println(username); 
      System.out.println(password); 
     } 

     catch (SQLException se){ 
      se.printStackTrace(); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
     finally { 
      try { 
       if(st != null) 
        con.close();    
      } 
      catch(SQLException se) { 

      } 
      try { 
       if(con != null) 
        con.close(); 
      } 
      catch(SQLException se) { 
       se.printStackTrace(); 
      } 

     } 

    } 

GetLogin类:

private String u; 
private String p; 
private String dbU; 
private String dbP; 
private String userU; 
private String userP; 

GetLogin(String username, String password){ 

    u = username; 
    p = password; 

} 

public void getDBDetails (String u) { 
    DBMod details = new DBMod(); 
    details.getData(u); 
} 

public void DBDetails(String username, String password) { 
    dbU = username; 
    dbP = password; 
    System.out.println(dbU); 
    System.out.println(dbP); 

} 

public void userDetails(String username, String password) { 
    userU = username; 
    userP = password; 
    System.out.println(); 
    System.out.println(); 
    System.out.println(); 
    System.out.println(); 
    System.out.println(userU); 
    System.out.println(userP); 
    System.out.println(); 
    System.out.println(); 
    System.out.println(); 
    System.out.println(); 
    System.out.println(); 
} 

public void checkData(){ 
    System.out.println(); 
    System.out.println(); 
    System.out.println(); 
    System.out.println(); 
    System.out.println(); 
    System.out.println(dbU); 
    System.out.println(dbP); 
    System.out.println(userU); 
    System.out.println(userP); 
    System.out.println(); 
    System.out.println(); 
    System.out.println(); 
    System.out.println(); 

    if (userU.equals(dbU) && userP.equals(dbP)) { 
     System.out.println("Sign in Successful!"); 
    } 
    else { 
     System.out.println("Incorrect username or password"); 
    } 
} 

public void getDetails() { 
    System.out.println(); 
    System.out.println(); 
    System.out.println(); 
    System.out.println(); 
    System.out.println(dbU + " " + dbP); 
    System.out.println(); 
    System.out.println(); 
    System.out.println(); 

} 
+1

这是一个程序,有一半是不是 – ja08prat

+1

为什么你问互联网的问题是......只是用一个调试器一步一步...... – Siyual

+0

是的xD大一个,它非常令人沮丧,有这样一个小小的问题。过去2个小时一直令我疯狂。 –

回答

3

然而,地方完成GetData方法并调用checkData方法都变DBU和DBP都设置为null,我找不到在哪里,或者为什么...

号之间,他们是从来没有设置一个不同于null的值,至少不是你调用checkData的实例。在你的getData方法中,你创建了一个GetData类的不同实例,并为这个新实例设置信息,而不是现有的实例。

void getData(String u, GetData details) { 
    ... 
} 

public void getDBDetails (String u) { 
    DBMod details = new DBMod(); 
    details.getData(u, this); 
} 

不过我建议重写程序

你可以通过将GetData实例作为参数,而不是创建一个新的getData方法解决这个问题

boolean checkLoginData(String username, String password) { 
    DBMod dbmod = new DBMod(); 
    return password != null && password.equals(dbmod.getData(username)); 
} 
public String getData(String u) { 
    try { 
     //Register JDBC driver 
     Class.forName("com.exasol.jdbc.EXADriver"); 

     try (Connection con = DriverManager.getConnection(DB_URL, USER, PASS)) { 
      //Execute a Query 
      String data = "SELECT USERNAME, PASSWORD FROM ES.USERS WHERE USERNAME = ?"; 
      PreparedStatement st = con.prepareStatement(data); 
      st.setString(1, u); 

      ResultSet rs = st.executeQuery(); 

      if (rs.next()) { 
       return rs.getString("PASSWORD"); 
      } else { 
       return null; 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return null; 

} 

简单得多,不是吗?

+0

是的,这是一种可能性 - 现在我们的同事只需要开始听:) – kleopatra

+0

感谢您的帮助。反而感到沮丧,无论如何都会退出,所以可能会重写。我相当新,并作为一个学校项目。我对不提供最优雅的解决方案或代码表示歉意。 –

+0

我的代码有点迷茫。我知道它更简单,它的功能我只是不知道如何处理返回以转到下一个窗格,以告知登录是否已被确认。介意向一个noob解释? –

0

没有检查你的代码,但完全看 到这部分代码

public void getData(String u) { 
    String username = null; 
    String password = null; 
    GetLogin details = new GetLogin(username, password); 

你开始使用用户名和密码,以班级为空

+0

是的,认为这可能是,但检查,而不是。在进一步查看之后,它可能是DBMod类最后的finally子句。将尝试从那里修复。 –

+0

尝试没有做任何事情,所以仍然完全失去。 –

+0

我确定它不是最终导致这个问题。尝试将您的用户名和密码传递给getData方法,并使用这些变量而不是null启动GetLogin类 – Jeyaprakash

-3

getDBDetails()被定义为寻找两个参数,但你调用它只有一个发送。

+0

不,它需要只有一个字符串 – Jeyaprakash