Вопрос

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

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.А также сделайте это, введя ник, IP-адрес и местоположение файла в консоли.В первый раз, когда я запустил его, он работал нормально, но выдавал исключение (NullPointer).Теперь, когда я запускаю его, он компилируется нормально, но говорит, что у меня уже есть этот пользователь в списке, хотя я всегда указываю другой ник / IPAddress / fileLocation.

Я считаю, что с объектом User что-то не так, который, вероятно, остается неизменным каждый раз, когда я пытаюсь его запустить.

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

Это было полезно?

Решение

В вашей программе есть main с одним подобным вызовом

 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!");

Когда вы вводите что-либо, кроме "ВСТАВИТЬ" ypu, нажимая на метод "пользователь уже существует".Я бы всегда разделял предложения, передавал разные послания.

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top