2009-11-25 5 views
-2

J'ai un objet qui est étudiant étudiant; qui a quelques champs comme le nom, la famille, ... Je veux faire un nom d'utilisateur pour cet étudiant et en cliquant sur le bouton un, je veux montrer le nom d'utilisateur de l'étudiant sur la console mais il montrera ces phrases sur la console (je l'ai copié et collé juste une partie de cette) ----->pourquoi il montre NullPointerException?

java.lang.NullPointerException à registration.Students.nextUserName (Students.java:149) à ui.AddStudent.submit (AddStudent.java:254) à ui.AddStudent.jButton1ActionPerformed (AddStudent.java:186) à ui.AddStudent.access 000 $ (AddStudent.java:24) à ui.AddStudent $ 1.actionPerformed (AddStudent.java:76) at javax.swing.AbstractButton.fireActionPerformed (AbstractButton.java:19 95) à javax.swing.AbstractButton $ Handler.actionPerformed (AbstractButton.java:2318) à javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:387) à javax.swing.DefaultButtonModel.setPressed (DefaultButtonModel.java: 242) à javax.swing.plaf.basic.BasicButtonListener.mouseReleased (BasicButtonListener.java:236) à java.awt.Component.processMouseEvent (Component.java:6038) à javax.swing.JComponent.processMouseEvent (JComponent. java: 3265) . . .

une partie de ma classe d'étudiants qui s'étend aussi humain:

public String nextUserName() { 
    StringBuffer user = new StringBuffer(); 
    SystemManagement students = new SystemManagement(); 
    String name1 = students.getName(); 
    char char1 = name1.charAt(0); 
    String family1 = students.getFamily(); 
    char char2 = family1.charAt(1); 
    setUserName(name1 + "." + family1); 
    if (user.length() != 0 && user.toString().equals(getUserName())) { 
     char[] allowedCharacters1 = {char1, char2, '1', '.'}; 
     SecureRandom random = new SecureRandom(); 

     for (int i = 0; i < user.length(); i++) { 
      user.append(allowedCharacters1[random.nextInt(allowedCharacters1.length)]); 
     } 
     setUserName(user.toString()); 
    } 

    return getUserName(); 

} 

public String currentUserName() { 
    return getUserName(); 
} 

public static Students getInstance() { 
    if (instance == null) { 
     instance = new Students(); 
    } 
    return instance; 
} 

ma classe humaine: Méthode

private String userName; 

public Human(String userName) { 

    this.userName = Students.getInstance().nextUserName(); 
} 

public void setUserName(String userName) { 

    this.userName = userName; 
} 

public String getUserName() { 
    return userName; 
} 

Merci je l'ai changé ma netUserName() pour cela, mais il return null au lieu de exception.

public String nextUserName() { 
    StringBuffer user = new StringBuffer(); 
    SystemManagement students = new SystemManagement(); 
    String name1 = students.getName(); 
    String family1 = students.getFamily(); 
    if(name1 !=null && family1 !=null) { 
    char char1 = name1.charAt(0); 
    char char2 = family1.charAt(1); 
    setUserName(name1 + "." + family1); 
    if (user.length() != 0 && user.toString().equals(getUserName())) { 
     char[] allowedCharacters1 = {char1, char2, '1', '.'}; 
     SecureRandom random = new SecureRandom(); 
     for (int i = 0; i < user.length(); i++) { 
     user.append(allowedCharacters1[random.nextInt(allowedCharacters1.length)]); 
     } 
     setUserName(user.toString()); 
    } 
    } 
    return getUserName(); 
} 
+0

Quelle ligne lance-t-il le pointeur nul? –

+1

@Johanna - vous avez utilisé Java ... et SO ... assez longtemps maintenant que vous ne devriez plus avoir à vous rappeler d'inclure des traces de pile ET des numéros de ligne pertinents. Obtenez votre acte ensemble mon pote! –

Répondre

0

Lors de la création d'un nouveau SystemManage, que retourne-t-il exactement?

La valeur null est sur la ligne 3 ou 4 de la méthode nextUserName, vérifiez si! = Null avant de commencer.

0

Le message d'exception montre que vous êtes quelque part sur la ligne 149 de Students.java (qui est quelque part dans la méthode nextUserName()) tente d'accéder à une propriété ou méthode d'un objet null. Par exemple, si students.getName(); renvoie null, vous obtiendrez cette exception sur la ligne suivante lorsque vous essayez d'appeler le chatAt().

Sans la source de SystemManagement il est difficile d'entrer dans plus de détails, mais si vous trouvez quelle ligne est 149, vous devriez être en mesure de retracer d'où vient le null.

10

Il montre NullPointerException parce que vous avez un pointeur NULL sur la ligne 149. Je ne sais pas lequel est la ligne 149, donc nous allons examiner les options:

StringBuffer user = new StringBuffer(); 

Ne peut pas être cette ligne. C'est en train de créer un nouvel objet.

SystemManagement students = new SystemManagement(); 

Ne peut pas être cette ligne, non plus, pour la même raison. (Bien que je sois perplexe ce qu'est une gestion de système, et pourquoi "étudiants" serait un bon nom pour un tel objet.

String name1 = students.getName(); 

Ne peut pas être cette ligne. Nous savons déjà que students ne peut pas être nul (sinon la ligne précédente aurait levé une exception différente sans permettre à l'exécution d'atteindre cette ligne).

char char1 = name1.charAt(0); 

Peut-être que l'un. Utilisez votre débogueur pour inspecter la valeur de name1. Est-ce nul? Quel nom attendez-vous pour obtenir d'une toute nouvelle gestion du système?

String family1 = students.getFamily(); 

Ne peut pas être celui-là.

char char2 = family1.charAt(1); 

Peut-être celui-là. Quelle famille attendez-vous d'une toute nouvelle gestion de système?

setUserName(name1 + "." + family1); 

Ne peut pas être celui-ci. Si l'une de ces deux variables de chaîne était null, vous auriez obtenu l'exception plus tôt, lorsque vous avez appelé charAt sur eux. Tout ce qui suit cette ligne utilise les deux objets de chaîne ou utilise des objets nouvellement créés. Nous pouvons donc éliminer le reste de la méthode. Concentrez votre attention sur les deux lignes que j'ai indiquées (ou sur la ligne que vous connaissez comme ligne 149).


Vous avez changé votre code pour vérifier que name1 et family1 ne sont pas nuls avant de les utiliser, mais je ne pense pas que vous avez vraiment considéré le problème sous-jacent. Qu'est-ce qu'un nouveau SystemManagement supposé pour vous donner le nom d'utilisateur et le nom de famille? Seront-ils jamais quelque chose autre que null?

Évidemment, l'une ou l'autre de ces valeurs est null, donc vous passez tout le reste de la méthode jusqu'à la dernière ligne, où vous appelez getUserName. Puisque vous avez sauté l'appel à setUserName, quelle est la valeur getUserName censée retourner à la place? (Si vous ne savez pas, allez le découvrir.)

Lorsque vous demandez "Pourquoi mon programme fait-il X?" répondre avec une autre question: "Pourquoi ne devrait pas il fait X?" C'est vous qui écrivez le code, donc le programme fait exactement ce que vous lui avez demandé de faire. Si ce n'est pas ce que vous attendiez, alors vous lui avez donné de mauvaises instructions. Parcourez votre code, une ligne à la fois s'il le faut, et déterminez où les choses se sont mal passées. Assurez-vous de comprendre exactement ce que chaque ligne de votre code fera. Si vous avez une ligne et que vous ne la comprenez pas, allez lire la documentation, demandez à votre instructeur ou demandez ici. Parcourez l'exécution sur le papier, en gardant trace de la valeur de chaque variable et en supprimant les anciennes valeurs au fur et à mesure que vous les réaffectez. Si vous avez plusieurs instances d'une classe, assurez-vous de garder une trace de l'instance avec laquelle vous travaillez à un moment donné.

(Un jour, vous pourriez rencontrer un problème dû à des facteurs externes: un compilateur buggé, une mauvaise RAM, des spécifications mal implémentées, etc. Aujourd'hui, ce n'est pas ce jour-là.Si vous en doutez, assurez-vous que vous avez d'abord exclu toute possibilité que ce soit votre propre erreur.)

+0

+1 plus approfondi que ma réponse – Kieron

+0

C'est incroyable combien de personnes manquent des compétences de débogage les plus simples. +1 – Bombe

+1

+1 pour un jour, vous pourriez .... –

Questions connexes