我有以下两个类:
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中。并且还通过在控制台中键入nickname,ipAddress和fileLocation来执行此操作。我第一次运行它,它工作正常,但它抛出一个异常(NullPointer)。 现在,当我运行它时,它编译得很好,但它说我已经在列表中有该用户,尽管我总是给出不同的昵称/ ipAddress / fileLocation。
我相信User对象在每次尝试运行时都可能保持不变。
我希望有人帮助我。感谢
答案 0 :(得分: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”ypu以外的任何内容时。我总是将这些条款分开,给出不同的信息。
答案 1 :(得分:0)
我想知道你是否遇到问题,因为你有两个不同的东西试图获取System.in对象。您的User类中有一个Scanner,要求使用System.in,并且您的另一个类中有一个扫描器,要求使用System.in。控制台如何知道将输入传递给哪个对象?
这可能不是您的问题,但您可能需要重新设计类,以便只有一个人从命令行接受用户输入。