2013-05-15 3 views
0

EDITJava ArrayList NullPointerException

J'ai nettoyé la méthode equals pour l'égalité des cordes et a changé l'initialisation de ContactsCollection à:

public static ArrayList<Contact> contactList = new ArrayList<Contact>(); 

J'ai aussi changé la méthode réalisée d'action dans l'espoir que "Afficher les contacts" montrerait plus d'un contact. Finalement, le fichier .dat est écrit mais ne contient aucune donnée ajoutée via l'interface graphique.

FIN EDIT

Je vous écris une interface graphique de téléphone fictif qui agit comme un gestionnaire de contacts très basique. Il existe plusieurs autres classes qui ne fonctionnent pas avec ArrayList qui fonctionnent comme prévu.

Lorsque vous tentez d'ajouter un contact au fichier que je reçois une exception de pointeur nul à la ligne 13 de la classe ContactsCollection:

for (int i = 0; i < contactList.size(); i++) 

et la ligne 93 de la classe Contacts (GUI):

contactList.add(contact); 

J'ai l'impression d'avoir fait quelque chose de mal lors du codage des classes Contacts et ContactsCollection. J'espère que le programme s'exécutera comme suit: L'utilisateur clique sur ajouter un contact et entre l'information qui devient un objet Contact et est ajouté à la liste de contacts ArrayList et écrit (sérialisé) dans un fichier "contactList.dat". Lorsque l'utilisateur clique sur les contacts d'affichage, le fichier est lu et chaque contact est affiché dans l'interface graphique.

Je pense qu'il y a plusieurs problèmes avec la façon dont j'ai configuré ArrayList, mais je pense que je suis très proche de faire tourner le programme comme je l'avais espéré. Toute aide est grandement appréciée!

Contacts Classe:

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

public class Contact implements Serializable 
{ 
public static final long serialVersionUID = 42L; 
public String name, number; 

Contact() 
{ 
    name = "No name"; 
    number = "No number"; 
} 

Contact (String theName, String theNumber) 
{ 
    this.name = theName; 
    this.number = theNumber; 
} 

public void setName(String aName) 
{ 
    this.name = aName; 
} 

public void setNumber(String aNumber) 
{ 
    this.number =aNumber; 
} 

public String getName() 
{ 
    return name; 
} 

public String getNumber() 
{ 
    return number; 
} 

public String toString() 
{ 
    return name + ": " + number; 
} 

public boolean equals(Contact other) 
{ 
    if (name.equals(other.getName()) && number.equals(other.getNumber())) 
    { 
     return(true); 
    } 
    else 
    { 
     return(false); 
    } 
} 
} 

Contacts classe Collection

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

class ContactsCollection 
{ 
public static ArrayList<Contact> contactList; 

public static void write() 
{ 
    try 
    { 
     ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("contactList.dat")); 
     for (int i = 0; i < contactList.size(); i++) 
     { 
      out.writeObject(contactList.get(i)); 
     } 
     out.close(); 
    } 
    catch(IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 

public static void read() 
{ 
contactList = new ArrayList<Contact>(); 
try 
{ 
    ObjectInputStream in = new ObjectInputStream(new FileInputStream("contactList.dat")); 
    Contact temp; 
    while (in.available()!=0) 
    { 
     temp = (Contact)in.readObject(); 
     contactList.add(temp); 
    } 
    in.close(); 
} 
catch(FileNotFoundException e) 
{ 
    e.printStackTrace(); 
} 
catch(IOException e) 
{ 
    e.printStackTrace(); 
} 
catch(ClassNotFoundException e) 
{ 
    e.printStackTrace(); 
}  

} 
} 

Contacts (GUI) classe

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import javax.swing.Timer; 
import java.util.*; 

class Contacts extends JFrame implements ActionListener, WindowListener 
{ 
public static final int WIDTH = 400; 
    public static final int HEIGHT = 600; 
    public static final int SMALL_WIDTH = 200; 
    public static final int SMALL_HEIGHT = 100; 

private static final Dimension stdBtn = new Dimension(150, 50);  

    JPanel centerPanel, northPanel, southPanel; 
ImageIcon icon; 
JLabel picture; 
JButton addContact, displayContacts; 
JScrollPane scroll; 
JTextArea textArea; 
Clock clock; 
Background background; 
Contact contact; 
ArrayList<Contact> contactList; 


public Contacts() 
{ 
    super("Contacts"); 
    this.setLayout(new BorderLayout()); 
    this.setSize(WIDTH, HEIGHT); 
    this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
    addWindowListener(this); 
    this.setLocationRelativeTo(null); 

    centerPanel = new JPanel(); 
    northPanel = new JPanel(); 
    southPanel = new JPanel(); 

    centerPanel.setBackground(Color.BLACK); 
    southPanel.setBackground(Color.BLACK);  

    clock = new Clock(); 
    northPanel.add(clock); 

    icon = new ImageIcon("ContactsBackground.jpg"); 
    picture = new JLabel(icon); 
    centerPanel.add(picture); 

    textArea = new JTextArea("", 10, 30); 
    textArea.setEditable(false); 
    JScrollPane scroll = new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
      JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);  
    centerPanel.add(scroll);  

    JButton displayContacts = new JButton("Display contacts"); 
    displayContacts.addActionListener(this); 
    southPanel.add(displayContacts); 

    JButton addContact = new JButton("Add contact"); 
    addContact.addActionListener(this); 
    southPanel.add(addContact); 

    this.add(northPanel, BorderLayout.NORTH); 
    this.add(centerPanel, BorderLayout.CENTER); 
    this.add(southPanel, BorderLayout.SOUTH);  

    setResizable(false);   
} 

public void actionPerformed(ActionEvent e) 
{ 
    contactList = new ArrayList<Contact>(); 
    JButton source = (JButton)e.getSource(); 
    String contactInput = source.getText(); 

    if (contactInput == "Display contacts") 
    { 
     ContactsCollection.read(); 
     for (int i = 0; i < contactList.size(); i++) 
     { 
      contact = (Contact)contactList.get(i); 
      textArea.setText(contact.getName() + "," + contact.getNumber() + "\n"); 
     } 
    } 
    if (contactInput == "Add contact") 
    { 
     String name = JOptionPane.showInputDialog(null, "Enter Name"); 
     String number = JOptionPane.showInputDialog(null, "Enter Number"); 
     contact = new Contact(name, number); 
     contactList.add(contact); 
     ContactsCollection.write(); 
    } 
} 

public void windowOpened(WindowEvent e) 
{} 

public void windowClosing(WindowEvent e) 
{ 
    this.setVisible(false); 
    background = new Background(); 
    background.setVisible(true);   
} 

public void windowClosed(WindowEvent e) 
{} 

public void windowIconified(WindowEvent e) 
{} 

public void windowDeiconified(WindowEvent e) 
{} 

public void windowActivated(WindowEvent e) 
{} 

public void windowDeactivated(WindowEvent e) 
{}  
} 
+3

c'est trop de code. où est la ligne 13? – Ankit

Répondre

3

changement

public static ArrayList<Contact> contactList; 

à

public static ArrayList<Contact> contactList = new ArrayList<>(); 

dans votre version contactList est null parce que vous ne l'initialiser et dans la méthode write() vous essayez d'appeler size() là-dessus.


En outre, il y a quelques défauts graves dans votre classe GUI (dans la méthode actionPerformed()), lisez cette question pour les fixer: How do I compare strings in Java?


Rappelez-vous aussi que textArea.setText(...) mettra le texte complet pour le textArea, donc parce que c'est dans une boucle dans votre code, le textArea contiendra seulement la sortie de la dernière itération de cette boucle. Dans votre cas, ce sera seulement le dernier contact.

+0

Merci beaucoup! – user2380220

+0

J'ai mis à jour le code en haut pour montrer les changements que j'ai faits. À ce stade, il écrit le fichier .dat, mais seulement Ԁ apparaît dans le fichier. – user2380220

+0

@ user2380220: Vous ne verrez toujours que le dernier contact dans votre zone de texte. Au lieu d'avoir 'contactList' en tant que membre de classe, utilisez-le comme un attribut d'instance pour le sérialiser. – jlordo