2

我有以下两个课程:

import java.io.*;
import java.util.*;

public class User {

    public static String nickname;
    public static String ipAddress;
    public static ArrayList<String> listOfFiles;
    public static File sharedFolder;
    public static String fileLocation;

    public User(String nickname, String ipAddress, String fileLocation) {

        this.nickname = nickname.toLowerCase();
        this.ipAddress = ipAddress;

        Scanner userTyping = new Scanner(System.in);
        fileLocation = userTyping.nextLine();

        sharedFolder = new File(fileLocation);

    }

    public static List<String> fileList() {

        File[] files = sharedFolder.listFiles();

        listOfFiles = new ArrayList<String>();

        for (int i = 0; i < files.length; i++) {

            listOfFiles.add(i, files[i].toString().substring(fileLocation.length()));
            System.out.println(listOfFiles.get(i));

        }

       return listOfFiles;

    }

    @Override
    public String toString() {
        return nickname + " " + ipAddress;
    }



}

下一个:

import java.util.*;


public class UserCollector {

    static List<User> allUsers;

    public static void addUserToTheList() {

        Scanner keyboardInput = new Scanner(System.in);

            System.out.println("Type nickname: ");
        String nickname = keyboardInput.nextLine();
            System.out.println("Type IP: ");
        String ipAddress = keyboardInput.nextLine();
            System.out.println("Type File Location: ");
        String fileLocation = keyboardInput.nextLine();

        System.out.println("User that is attempting to log in is: "+ nickname + " and his IP is: " + ipAddress);

        User inputUser = new User(nickname, ipAddress, fileLocation);

        allUsers = new ArrayList<User>();

        if (keyboardInput.nextLine().equalsIgnoreCase("INSERT") && !allUsers.contains(inputUser)) {

            allUsers.add(inputUser);
            System.out.println("User has been successfully added to your list.");
        }
        else
            System.out.println("This user already exists on the list!");

    }

    public static void currentStateOfTheList() {

        for (User u : allUsers) {
               System.out.println("nick: "+u.nickname +", ip: "+ u.ipAddress );
           }

    }

    public static void main(String[] args) {

        UserCollector.addUserToTheList();
        UserCollector.currentStateOfTheList();

    }

}

现在,addUserToTheList() 方法的想法很简单。将 User 类型的对象添加到 ArrayList 中。也可以通过在控制台中输入昵称、ipAddress 和 fileLocation 来实现。我第一次运行它时,它运行良好,但它抛出了一个异常(NullPointer)。现在,当我运行它时,它编译得很好,但它说我已经在列表中拥有该用户,尽管我总是给出不同的昵称/ipAddress/fileLocation。

我相信用户对象有问题,每次我尝试运行它时都可能保持不变。

我希望有人帮助我。谢谢

4

2 回答 2

2

你的程序有一个这样的调用

 UserCollector.addUserToTheList();

当程序完成时,列表被销毁。下次你运行时,你会得到一个新的列表。如果您的意图是添加大量用户,那么您需要不断提示更多用户,或者您需要将正在构建的列表保存在某处。

你打电话

  allUsers = new ArrayList<User>();

每次在 addUserToTheList 中,因此您将为每个新用户创建一个新列表。您可能应该在构造函数中对其进行初始化。但是你不应该使用静态方法。正如我之前建议你的那样,你的主要应该

 UserCollector myCollector = new UserCollector();

 myCollector .addUserToTheList();

UserCollector 构造函数可以初始化用户列表

public class UserCollector {

    private List<User> allUsers;
    public UserCollector() {
          allUsers = new ArrayList<User>();
    }

那么你不需要静态方法。

看这个:

    if (keyboardInput.nextLine().equalsIgnoreCase("INSERT") 
              && !allUsers.contains(inputUser))    {
        allUsers.add(inputUser);
        System.out.println("User has been successfully added to your list.");
    }
    else
        System.out.println("This user already exists on the list!");

当您键入“INSERT”以外的任何内容时,点击“用户已存在”方法。我总是将条款分开,给出不同的信息。

于 2010-01-10T19:16:31.117 回答
0

我想知道您是否遇到问题,因为您有两个不同的东西试图获取 System.in 对象。您的 User 类中有一个 Scanner 请求 System.in,而您的另一个类中有一个 Scanner 请求 System.in。控制台如何知道将输入传递给哪个对象?

这可能不是您的问题,但您可能希望重新设计您的类,以便只有一个接受来自命令行的用户输入。

于 2010-01-10T18:57:23.177 回答