2010-01-10 5 views
2

je les deux catégories suivantes:ma classe Java addUserToTheList() ne fonctionne pas

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; 
    } 



} 

et la suivante: méthode

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(); 

    } 

} 

Maintenant, l'idée du addUserToTheList() est simple. Ajoutez des objets de type User dans ArrayList. Et faites-le en tapant nickname, ipAddress et fileLocation dans la console. La première fois que je l'ai couru, ça a bien fonctionné mais ça a jeté une Exception (NullPointer). Maintenant, quand je l'exécute, il compile bien mais il dit que j'ai déjà cet utilisateur dans la liste bien que je donne toujours un pseudo différent/ipAddress/fileLocation.

Je crois qu'il y a quelque chose qui cloche avec l'objet Utilisateur qui reste probablement le même chaque fois que j'essaie de l'exécuter.

J'espère que quelqu'un m'aide. Merci

+3

vous continuez d'utiliser le mot-clé 'static'. Tu sais ce que ça veut dire? –

+0

Il y a trop de code ici. Je crains que vous ayez à faire plus de lecture et de débogage pour que votre question se résume à une question concrète. – bmargulies

+0

Je crois que ma question est concrète. Si je connaissais un autre moyen (plus court) de poser cette question, je l'aurais choisi :) – AmateurProgrammer

Répondre

2

Votre programme a un principal avec un appel comme celui-ci

UserCollector.addUserToTheList(); 

Lorsque le programme est terminé, la liste est détruite. La prochaine fois que vous courez, vous obtenez une nouvelle liste. Si votre intention est d'ajouter beaucoup d'utilisateurs, vous devez continuer à demander plus d'utilisateurs ou vous devez sauvegarder la liste que vous construisez quelque part.

Vous appelez

allUsers = new ArrayList<User>(); 

Chaque fois que dans addUserToTheList, d'où pour chaque nouvel utilisateur, vous allez créer une nouvelle liste. Vous devriez probablement l'initialiser dans un constructeur à la place. Mais alors vous ne devriez pas utiliser des méthodes statiques. Comme je vous ai conseillé avant, votre principal devrait

UserCollector myCollector = new UserCollector(); 

myCollector .addUserToTheList(); 

Le constructeur UserCollector peut initialiser la liste des utilisateurs

public class UserCollector { 

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

vous n'avez pas besoin de méthodes statiques.

Regardez ceci:

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

Lorsque vous tapez quoi que ce soit autre que « INSERT » ypu avec succès la méthode « utilisateur existe déjà ». Je séparerais toujours les clauses, donnerais des messages différents.

+0

OK, je vais vous écouter complètement cette fois et vous informerai des changements éventuels.Merci encore :) – AmateurProgrammer

+0

Encore une question, que dois-je mettre dans le constructeur? Je ne suis pas complètement clair avec ce – AmateurProgrammer

+0

J'ai modifié la réponse pour montrer le constructeur. – djna

0

Je me demande si vous rencontrez des problèmes parce que vous avez deux choses différentes essayant d'obtenir à l'objet System.in. Vous avez un scanner dans votre classe User demandant System.in, et vous avez un scanner dans votre autre classe demandant System.in. Comment la console sait-elle quel objet passer votre entrée?

Cela peut ne pas être votre problème, mais vous souhaiterez peut-être revoir la conception de vos classes afin qu'une seule accepte les entrées utilisateur de la ligne de commande.

Questions connexes