мой класс Java addUserToTheList () не работает - PullRequest
2 голосов
/ 10 января 2010

У меня есть два следующих класса:

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, который, вероятно, остается неизменным каждый раз, когда я пытаюсь запустить его.

Я надеюсь, что кто-то мне поможет. Спасибо

Ответы [ 2 ]

2 голосов
/ 10 января 2010

В вашей программе есть основной с одним вызовом, как это

 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, нажимаете «user Уже существует». Я бы всегда разделял пункты, давал разные сообщения.

0 голосов
/ 10 января 2010

Интересно, возникают ли у вас проблемы, потому что у вас есть две разные вещи, пытающиеся получить объект System.in. В вашем классе User есть сканер, запрашивающий System.in, а в другом классе у вас есть сканер, запрашивающий System.in. Как консоль узнает, к какому объекту передать ваш ввод?

Возможно, это не ваша проблема, но вы можете изменить классы так, чтобы только один из них принимал пользовательский ввод из командной строки.

...