2016-04-16 146 views
0

我已創建在當服務器正在運行,新的客戶端連接,新用戶應該被添加到「投標人」階層和他們的名字應該輸出一個簡單的服務器和客戶端應用程序數組列表get函數時,在這種情況下,我使用的名稱是靜態的,並且用戶沒有輸入他們的名字,在這種情況下是「Jordan」。所以,在客戶端連接後,添加一個新的投標人,然後檢索並輸出。但是,當輸出我收到一個空指針異常。NullPointerException異常調用

檢索用戶名:

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

投標類:

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

我認爲,用戶的姓名被添加到ArrayList不過,我無法恢復,和我不確定原因。

+1

看看堆棧跟蹤。它會精確地告訴你在哪個源文件的哪一行發生'NullPointerException'。那裏有東西是'空'的。例如,當你試圖在一個'null'變量上調用一個方法時,你會得到這個異常。 – Jesper

+1

似乎應該很簡單。你已經寫了一些相當複雜,不可讀的代碼。我看到你已經在Bidder類中聲明瞭userNamesHandle,但它從未在任何地方初始化過。如果你退出,你保證獲得NPE。 – duffymo

+0

不要命名與普通類相同的變量,例如'String',或者像任何分區 –

回答

0

的問題是在Bidder類的getUserName方法。

如果userNamesHandlenull,則聲明return userNamesHandle.get(newNumOfUsers);將拋出NullPointerException

在類的構造函數,你將它初始化爲null

+0

好吧然而,如果我然後更改userList.add(incrementUsers,處理=新投標者(名稱,客戶端,這,incrementUsers + 1));爲userNamesHandle.add ...然後這應該添加一個值到數組列表中,但事實並非如此。 – DaveDavidson

+0

@DaveDavidson你應該將'userNamesHandle'初始化爲'null'以外的東西。例如'userNamesHandle = new ArrayList <>();'。坦率地說,你的代碼有點亂。爲什麼'Bidder'具有一個構造函數,它具有4個不使用的參數?爲什麼'Bidder'有一個'ArrayList '成員變量? – Jesper

相關問題