无法从同一类内的方法访问类属性ArrayList中的值

时间:2019-03-14 14:41:44

标签: java arraylist

我正在为一个大学从事Java项目,但我对Java没有任何了解。我简化了代码以尝试显示问题。

我从数据库中获取了一个包含一个User的ArrayList。该用户被证明存储在 users 中。

现在,调用 printArray(users)时永远不会打印此ArrayList的内容,并且找不到用户会打印到控制台,显示该数组为空,甚至但在被证明包含1个用户之前。

请在 try 部分

中查看评论
public class UserInterface extends Application {

UserRepo userRepo = new UserRepo();
ArrayList<User> users = new ArrayList<>();
UserController userController = new UserController();
public static void main(String args[]) throws SQLException{
    launch(args);
}

@Override
public void start(Stage primaryStage) throws Exception {

    String connectionURL = "jdbc:derby://localhost:1527/gymManager";
    String userName = "root";
    String userPassword= "root";

    try{
        Connection conn = DriverManager.getConnection(connectionURL, userName, userPassword);

        if(conn != null){

            //userRepo.read(conn) takes a Connection and returns an ArrayList<User>
            //users contains 1 user as proven by the next line
            users = userRepo.read(conn);

            //this outputs proves 1 user has been loaded from the database
            System.out.println("How many users loaded: " + users.size()); 


            //takes ArrayList to printArray
            printArray(users);

            //printArray says "No users found indicating the users.isEmpty()"

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

public void printArray(ArrayList users){
    if(users.isEmpty()){
        System.out.println("No users found.");
    }
    for(int i = 0; i < users.size(); i++){
        User currentUser = (User) users.get(i);
        System.out.println("First name = " + currentUser.getFirstName());
    }
}

}

public class UserRepo implements Repo {
private ArrayList<User> users = new ArrayList<>();

@Override
public ArrayList read(Connection conn) {
    ArrayList list = new ArrayList();
    System.out.println("Reading users from the database...");
    try {
        Statement st = conn.createStatement(); 
        ResultSet rs = null;
        String query = "SELECT * FROM Users";
        rs = st.executeQuery(query);
        while(rs.next()){
            String firstName = rs.getString("firstName");
            String lastName = rs.getString("lastName");
            String emailAddress = rs.getString("emailAddress");
            String password = rs.getString("password");

            User user = new User(firstName, lastName, emailAddress, password);
            list.add(user);
        }           
        st.close();
        rs.close();
    } catch (SQLException ex) {
        System.out.println("Exception:" + ex.toString()); 
    }
    users = list;
    return users;
}

}

2 个答案:

答案 0 :(得分:1)

显示的代码似乎没有明显的错误。但是,那里有危险点。 我认为列表users应该位于更本地的范围内,因为我认为它已在其他地方进行了修改。

首先进行一些清理。将list设为纯局部结果/变量可防止在未显示的代码中将其从其他位置更改。 UserRepo.users可能已被重置,例如通过新呼叫。

@Override
public List<User> read(Connection conn) {
    List<User> list = new ArrayList<>();
    System.out.println("Reading users from the database...");
    try {
        Statement st = conn.createStatement(); 
        String query = "SELECT * FROM Users";
        ResultSet rs = st.executeQuery(query);
        while (rs.next()) {
            String firstName = rs.getString("firstName");
            String lastName = rs.getString("lastName");
            String emailAddress = rs.getString("emailAddress");
            String password = rs.getString("password");

            User user = new User(firstName, lastName, emailAddress, password);
            list.add(user);
        }           
        rs.close();
        st.close();
    } catch (SQLException ex) {
        System.out.println("Exception:" + ex.toString()); 
    }
    return list;
}

您要小心地关闭Statement和ResultSet,连接可能需要同样的操作,否则第二次出现问题的查询调用可能会失败。

try{
    Connection conn = DriverManager.getConnection(connectionURL, userName, userPassword);

    if (conn != null){
        List<User> users = userRepo.read(conn);

        System.out.println("How many users loaded: " + users.size()); 
        printArray(users);
        conn.close();
    }

和printArray:

public void printArray(List<User> users){
    if (users.isEmpty()){
        System.out.println("No users found.");
    }
    for (User currentUser : users) {
        System.out.println("First name = " + currentUser.getFirstName());
    }
}

答案 1 :(得分:-1)

在不知道userRepo.read()方法内部存在什么的情况下很难说出什么失败。 一般来说,要从数据库获取任何数据,您需要创建特定于(在您的情况下)DerbyDB的正确查询语句。

我从没使用过Derby,但是通常需要从表SELECT语句中获取数据,因此类似SELECT * from users 应该返回users表中的所有数据。

在SELECT中,Java数据可以存储在ResultSet中,因此在代码中可能看起来像这样:

ResultSet resultSet = st.executeQuery("SELECT * FROM USERS");

下一步将调用ResultSet的next()以及也许getString()方法,但是在看到您的UserRepo类内容之前我们不确定。