2010-01-14 4 views
1

J'ai un utilisateur de classe qui contient des attributs: pseudo, ipAddress, sharedFolder. L'idée est d'avoir un utilisateur avec ces attributs et une liste de fichiers à partir d'un dossier partagé.Pourquoi ai-je cette NullPointerException?

Ceci est mon code:

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

public class User { 

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

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

     this.nickname = nickname.toLowerCase(); 
     this.ipAddress = ipAddress; 
     sharedFolder = new File(fileLocation); 

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

    public static void showTheList() { 
     for (int i = 0; i < listOfFiles.size(); i++) { 
      System.out.println(listOfFiles.get(i).toString()); 
     } 
    } 

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

    public static void main(String[] args) { 
     showTheList(); 
    } 
} 

Cependant, quand je le lance je ne peux pas obtenir la liste des fichiers. Il jette une exception:

Exception dans le thread "principal" java.lang.NullPointerException à User.showTheList (User.java:35) à User.main (User.java:52) Java Résultat: 1

Je sais qu'il est probablement une erreur peu petite, mais je ne peux pas sembler corriger :( S'il vous plaît aider

Répondre

5

listOfFiles étant un champ statique doit être initialisé dans un bloc statique, pas de constructeur.

à savoir

static{ 
    listOfFiles = new ArrayList<String>(); 
} 

ou vous pouvez également l'initialiser sur le site de la déclaration elle-même.

à savoir

static ArrayList<String> listOfFiles = new ArrayList<String>(); 

Dans votre code, vous ne créez pas un objet de la classe et donc listOfFiles référence est jamais attribué une instance ArrayList. C'est la raison pour laquelle vous obtenez un NullPointerException.

+0

Merci! Il était si évident :( Je dois faire une sieste au sérieux 13 heures de programmation tout droit n'est pas correct – AmateurProgrammer

1

Essayez ceci:.

public static void main(String[] args) { 
    new User(..., ..., ...); 
    showTheList(); 

} 

Vous n'avez attribué aucune valeur à la liste de diffusion, c'est pourquoi vous obtenez NullPointerException. BTW, nous l'appelons habituellement juste NPE.

+0

J'ai essayé dans l'autre classe qui appelle à l'utilisateur et crée un nouveau, mais il fonctionne toujours pas – AmateurProgrammer

3

Vous devez initialiser listOfFiles

static ArrayList<String> listOfFiles = new ArrayList<String>(); 
3

NullPointerException est l'exception la plus courante en Java. Vous devriez apprendre à y faire face par vous-même.

Elle se produit lorsque:

  • appel de la méthode d'instance d'un objet nul.
  • Accès ou modification du champ d'un objet nul.
  • Prendre la longueur de null comme s'il s'agissait d'un tableau.
  • Accéder ou modifier les emplacements de null comme s'il s'agissait d'un tableau.
  • Lance null comme s'il s'agissait d'une valeur Throwable.

  • (non inclus dans les docs) Libérer un nombre nul.

+3

* Unboxing un nombre/Booléen nul – BalusC

+0

yup .. ce n'est malheureusement pas inclus dans les docs – Bozho

+0

-1 Ce n'est pas vraiment un répondre à la question – nfechner

1

On dirait que listOfFiles n'a pas été initialisé. Vous devez d'abord créer un nouvel utilisateur, ou l'initialiser et le remplir dans une méthode statique

5

votre fonction "showTheList" suppose que listOfFiles est déjà rempli. Cependant, cette variable n'est pas créée tant que vous n'avez pas exécuté le constructeur User. En pratique, ce n'est pas une bonne idée d'initialiser une variable statique dans un constructeur d'instance. Si vous le faites de cette façon, il n'est pas clair à qui appartiennent les données. Dans ce cas, puisque listOfFiles dépend de l'état de l'instance de l'utilisateur, il ne doit pas être statique, et votre appel ressemblerait plus

User u = new User(..., ..., ...); 
u.showTheList(); 
+0

Merci, c'était aussi très utile – AmateurProgrammer

1

Je suppose que, vous utilisez la méthode principale dans cette classe. Dans ce cas, vous manquez un appel à votre constructeur.

1

je réécrire toute la classe comme celui-ci (Code Complete - Chapitre 7):

import java.io.File; 
import java.util.ArrayList; 

public class User { 

private String nickname; 
private String ipAddress; 
private String sharedFolder; 

public User(String nickname, String ipAddress, String sharedFolder) { 
    //TODO do some params check 
    this.nickname = nickname.toLowerCase(); 
    this.ipAddress = ipAddress; 
    this.sharedFolder = sharedFolder; 
} 

public void showFiles() { 
    ArrayList<String> listOfFiles = this.retrieveFileNames(); 
    for (String fileName : listOfFiles) { 
     System.out.println(fileName); 
    } 
} 

private ArrayList<String> retrieveFileNames() { 
    File folder = new File(this.sharedFolder); 
    File[] files = folder.listFiles(); 
    ArrayList<String> listOfFiles = extractFileName(files); 
    return listOfFiles; 
} 

private ArrayList<String> extractFileName(File[] files) { 
    ArrayList<String> listOfFiles = new ArrayList<String>(); 
    for (int i = 0; i < files.length; i++) { 
     listOfFiles.add(i, files[i].getPath().substring(
       sharedFolder.length() + 1)); 
    } 
    return listOfFiles; 
} 

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

public static void main(String[] args) { 
    User user = new User("tom", "127.0.0.1", "/tmp"); 
    user.showFiles(); 
} 
} 
+0

Merci beaucoup SOOO, je vais essayer et prendre quelques indices :) – AmateurProgrammer

+0

C'est super. Je l'ai testé et ça marche bien :) Vous êtes l'homme. Je vous remercie – AmateurProgrammer

Questions connexes