2016-04-16 6 views
0

Ich habe eine einfache Server-und Client-Anwendung erstellt, wenn der Server ausgeführt wird und ein neuer Client verbindet, ein neuer Benutzer sollte der "Bidder" -Klasse hinzugefügt werden und ihr Name sollte ausgegeben werden In diesem Fall ist der Name, den ich verwende, statisch und der Benutzer hat seinen Namen nicht eingegeben, der in diesem Fall "Jordan" ist. Bei der Client-Verbindung wird ein neuer Bieter hinzugefügt, der dann abgerufen und ausgegeben wird. Bei der Ausgabe empfange ich jedoch eine Nullzeigerausnahme.NullPointerException beim Aufruf von get Funktion auf Array-Liste

den Namen des Benutzers abzurufen:

final ArrayList<String> userNames = new ArrayList<String>(); 
    Bidder bidder1 = null; 
    final Bidder bidder = new Bidder(timeNow, client, bidder1, PORT); 
    final Users user = new Users(itemOne,itemTwo); 
    final ArrayList<ClientHandler> users = 
          new ArrayList<ClientHandler>(); 

    do 
    { 
     client = serverSocket.accept(); 
     System.out.println("\nUser" + (user.getNumOfUsers()+1) 
             + " has been accepted to the auction system.\n"); 
     System.out.println(bidder.getUserName()); 
     user.incUsers(users, client, handler); 

    }while (true); 

Der Bieter Klasse:

class Bidder 
{ 
    private ArrayList<Bidder> userNamesHandle; 

    public Bidder(String name, Socket client, Bidder bidder, int i) 
    { 
     userNamesHandle = null; 
    } 
    public synchronized void createUser(ArrayList<Bidder> userList,final Socket 
      client,Bidder handler) 
    { 
      String name = "Jordan"; 
      userList = userNamesHandle; 
      int incrementUsers=0; 

      for (final Bidder newBidder:userNamesHandle) 
      { 
       incrementUsers++; 
      } 
      userList.add(incrementUsers, handler = new Bidder(name, client, this, incrementUsers+1)); 
    } 
    public synchronized Bidder getUserName() 
    { 
     int newNumOfUsers = 0; 
     if(userNamesHandle != null) 
     { 
      for(final Bidder String:userNamesHandle) 
      { 
       newNumOfUsers++; 
      } 
     } 
     return userNamesHandle.get(newNumOfUsers); 
    } 
} 

Ich glaube, dass der Name des Benutzers jedoch zu dem Arraylist hinzugefügt wird, ich es nicht abrufen kann, und ich bin unsicher warum.

+1

Schauen Sie sich den StackTrace an. Es sagt Ihnen genau, in welcher Zeile der Quelldatei die 'NullPointerException' passiert. Etwas ist dort "null". Diese Ausnahme erhalten Sie beispielsweise, wenn Sie versuchen, eine Methode für eine Variable aufzurufen, die "null" ist. – Jesper

+1

Scheint wie es sollte einfach sein. Sie haben einen ziemlich komplexen, nicht lesbaren Code geschrieben. Ich sehe, dass Sie userNamesHandle in der Bidder-Klasse deklariert haben, aber es wird nie irgendwo initialisiert. Wenn Sie dereferenzieren, dass Sie garantiert NPE bekommen. – duffymo

+0

Benennen Sie keine Variablen, die den üblichen Klassen entsprechen, z. 'String', oder wie jeder clasess –

Antwort

0

Das Problem ist in der getUserName Methode der Klasse Bidder.

Die Anweisung return userNamesHandle.get(newNumOfUsers); wird eine NullPointerException werfen, wenn userNamesHandlenull ist.

Im Konstruktor der Klasse initialisieren Sie es auf null.

+0

okay, wenn ich dann userList.add geändert habe (incrementUsers, handler = neuer Bidder (Name, Client, dies, incrementUsers + 1)); UserNamesHandle.add ... das sollte dann einen Wert zur Array-Liste hinzufügen, dies ist jedoch nicht der Fall. – DaveDavidson

+0

@DaveDavidson Sie sollten 'userNamesHandle' auf etwas anderes als' null' initialisieren. Zum Beispiel 'userNamesHandle = new ArrayList <>();'. Ehrlich gesagt, Ihr Code ist ein bisschen durcheinander. Warum hat 'Bidder' einen Konstruktor, der 4 Parameter verwendet, die er nicht verwendet? Warum hat 'Bidder' eine 'ArrayList ' Membervariable? – Jesper

Verwandte Themen