2013-08-31 89 views
0

是否可以在延伸Thread的類中使用ArrayList?我已經寫了一些代碼從藍牙串行讀取正在工作,但我已經添加了一個ArrayList來跟蹤我正在閱讀的內容。但是,我得到NullPointException在任何線路訪問結果。 我知道ArrayList不是線程安全的(儘管我可能不完全理解這意味着什麼),所以我可能會嘗試做不可能的事情,但我認爲我會與專家一起檢查,因爲ArrayLists非常容易使用。我可以在擴展Thread的類中使用ArrayList嗎?

private class ConnectedThread extends Thread { 
    private final BluetoothSocket mmSocket; 
    private final InputStream mmInStream; 
    private List<String> results; 

    public ConnectedThread(BluetoothSocket socket) { 
     Log.d(TAG, "create ConnectedThread"); 
     mmSocket = socket; 
     InputStream tmpIn = null; 
     OutputStream tmpOut = null; 
     List<String> results = new ArrayList<String>(); 

     // Get the BluetoothSocket input and output streams 
     try { 
      tmpIn = socket.getInputStream(); 
      tmpOut = socket.getOutputStream(); 
     } catch (IOException e) { 
      Log.e(TAG, "temp sockets not created", e); 
     } 

     mmInStream = tmpIn; 
     mmOutStream = tmpOut; 

     init(); 
    } 

    private void init(){ 
     code = new byte[16]; 
     checksum = 0; 
     tempbyte = 0; 
     bytesread = -1; 
     if(!results.isEmpty()){ 
      Log.i(TAG, "Already have found: " + results.size() + " things."); 
     } 
    } 

    public void run(){ 
     //do things 
    } 
} 
+0

@PatriciaShanahan在構造函數中 –

+0

「是否可以在擴展Thread的類中使用ArrayList?」摘要:是的,當然是。 –

+0

謝謝大家的意見,他們都有幫助,但是我只能選擇1個答案。我不習慣Java,但現在我完全明白我做錯了什麼。 – aland

回答

5

在構造函數中,創建了具有相同的名稱,例如ArrayList中,並初始化一個本地的ArrayList參考。

List<String> results = new ArrayList<String>(); // This creates a local arraylist 

所以,您的實例ArrayList引用仍然null。更改該行:

results = new ArrayList<String>(); 
1

此行

List<String> results = new ArrayList<String>(); 

被分配在本地變量results一個數組列表。您可能認爲它正在分配類成員。嘗試改變,以

results = new ArrayList<String>(); 
0
this.results = results; //do this in constructor 
1

你的問題是,你是不是具有相同名稱的初始化實例變量,但只有一個局部變量。

在構造函數中刪除結果之前刪除列表。