【问题标题】:Adding objects to array list [duplicate]将对象添加到数组列表[重复]
【发布时间】:2016-02-06 16:13:12
【问题描述】:

您好,我正在尝试将我的类的对象添加到具有对象属性的 ArrayList 中,但我不断收到空指针 我正在从 txt 文件中读取值,将它们分配给属性,然后将对象放入数组列表中

这是我的代码

public class Users {
Scanner scan;
BufferedReader reader;
MainGui gui;
Login login;
String name;
String surname;
String dob;
String address;
String town;
String number;
String position;
ArrayList<Users> allUsers = new ArrayList<Users>();

 public Users(Login login){   
  this.login = login;
  open();
}
 public void open(){
  try {
    URL path = Users.class.getResource("records.txt");
    File f = new File(path.getFile());
    reader = new BufferedReader(new FileReader(f));
    scan = new Scanner(reader);
    } catch (FileNotFoundException e) {
    System.out.println("File not found");
    }
}

public void readRecords(){
 open();
 while(scan.hasNext()){
     Users user = new Users(login);
     user.name = scan.next();
     user.surname = scan.next();
     user.dob = scan.next();
     user.address = scan.next();
     user.address = addSpace(user.address);
     user.town = scan.next();
     user.number = scan.next();
     user.position = scan.next();
     allUsers.add(user);
 }
 scan.close();
 }
  public void printUsers(){
   readRecords();
     for(Users user : allUsers){
     System.out.println("" + user );
   }
   }
 }

我已经包含了所有参与其中的方法,以便您更好地帮助我。

【问题讨论】:

  • 你的主要方法是什么?
  • 抱歉,您的代码一团糟。你想让它做什么?在您的构造函数中,您正在使用null 初始化未使用的局部变量——您是否想改为初始化成员变量?之后,您拨打open()。所以每次你使用new Users() 创建一个对象时,你是在打开文件吗?然后在readRecords 你又打开了??然后您将scan.next() 的结果分配给this,而不是新创建的user 对象...
  • 你需要为你的Users类实现一个toString方法,否则它会像Users@389afb685一样打印

标签: java arraylist java.util.scanner null-pointer


【解决方案1】:

更改这部分代码,您需要在您正在创建的用户对象中设置值。

Users user = new Users(login);
user.name = scan.next();
..
allUsers.add(user);

最好为属性创建gettersetters

而且您不需要在构造函数中将值设置为 null,java 会为您完成。

【讨论】:

  • 我完全按照你说的做了,我在控制台中得到了这个 yuconz.Users@28ef6eaa yuconz.Users@53a7a372
  • 值得一提的是,模型对象不应该进行这种文件打开和输入提示。它应该只存在于存储变量
  • System.out.println 仅用于测试目的以查看它是否工作......如果我设法使其工作,这些变量最终将显示在 gui 中
  • 如果你想让 sysout 打印出更好的东西,那么你需要重写 Users 类的 toString 方法。 javapractices.com/topic/TopicAction.do?Id=55
【解决方案2】:

您正在执行该方法的实例中设置属性,但是您正在将新的(空)对象添加到您的数组列表中。因此,列表中充满了空的 Users 实例。

【讨论】:

  • 我知道你的意思我试过 allUsers.add(this);但这也打印了 2 个用户(txt 文件有 2 个“用户”),其属性值相同
  • 你倒退了。您的readRecords() 需要在循环内设置user 的字段。
【解决方案3】:

这段代码有点乱——它在一个类中做了太多的事情。您有一个名为 Users 的类,它有一个用户列表和一个用户的属性。列表中的每个用户也会有一个用户列表。

您似乎应该有两个类,一个称为用户,一个称为用户(或类似名称的类)

Users 类具有 s 列表并负责填充该列表(通过读取文件)。然后 User 类只保存特定用户的信息,以及与单个用户相关的任何操作。

然后,当您读取记录时,您可以获取扫描仪(就像您目前所做的那样),将其传递给用户,然后该特定用户对象将填充它自己的字段(类似于 awesome 所说的)

【讨论】:

    【解决方案4】:

    首先,我建议您在读取函数中创建 USERS 实例时放入“System.out.print”语句,以检查您是否从文件中正确读取了这些值。其次,在 Users 类中重写 toString() 以显示值,即

        public String toString() {
            System.out.println("Name: "+name+", surname: "+surname+", DOB: "+dob+", Address: "+address+", Town: "+town+", Number: "+number+", and Position: "+position);
        }
    

    现在你的System.out.println("" + user ); 应该显示从文件中读取的值。

    【讨论】:

      猜你喜欢
      • 2015-12-04
      • 2022-01-05
      • 2013-01-03
      • 2013-09-03
      • 2012-08-02
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多