2012-03-22 71 views
1

我有一個在市場上的應用程序,但在某些情況下,它強制關閉在公開。根據崩潰錯誤,indexOf命令(NullPointerException)有問題。部分代碼:Android的nullpointerexception在.indexOf()

contactName = null; 
Context context = getApplicationContext(); 
Cursor cursor = context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
myArr.add(""); 

while (cursor.moveToNext()) 
{ 
    contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
    spaceIndex = contactName.indexOf(' '); //this is the bad row 
    spaceLastIndex = contactName.lastIndexOf(' '); 
    myArr.add(contactName); 
} 

我在3種不同的手機上測試我的應用,應用工作正常。所以我不能測試代碼,如果我改變了一些東西,因爲我無法區分它們。什麼會導致錯誤,爲什麼只出現在幾部手機上? (下載量的5%)。有一個人聯繫了我這個錯誤,他的手機中有幾個特殊字符的聯繫人(HTC Legend CM 7.1和Vodafone 845 Android 2.1)。所以我給我的聯繫人添加了相同的字符,在名稱前放置了空格,嘗試了所有與聯繫人姓名混淆的應用,應用順利運行,所以這不是問題。我沒有選擇。

回答

1

您應該檢查contactName,如果它不爲null。我認爲,你想從中獲得價值的專欄只是空的。

if (contactName != null) { ...等等

+0

if(contactName!=「」)也不錯? – erdomester 2012-03-25 21:12:18

+0

我接受這個作爲第一個答案 – erdomester 2012-03-26 10:12:53

+0

if(contactName!=「」)不!這是行不通的! null和空字符串是兩個不同的東西 – Kousalik 2012-03-28 15:05:56

1

contactName顯然回來null。在您撥打indexOf之前,您需要進行一些空的檢查。

// snip 
while (cursor.moveToNext()) 
{ 
    contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
    if (contactName == null) continue; 

    spaceIndex = contactName.indexOf(' '); 
    spaceLastIndex = contactName.lastIndexOf(' '); 
    myArr.add(contactName); 
} 
+0

我會試一試。我在手機中創建了一個電話號碼的聯繫人,它工作正常... 而你的意思是if(contactName!= null),不是嗎? – erdomester 2012-03-22 19:46:54

+0

@erdomaster - 'continue'表示'不要執行它下面的行,但重新啓動循環' – NickT 2012-03-22 19:52:28

+0

謝謝,我不知道這個命令。 – erdomester 2012-03-22 19:53:32

1
contactName = cursor.getString(cursor.getColumnIndexorThrow(ContactsContract.Contacts.DISPLAY_NAME)); 

即使顯示名稱可以是空的某些情況下...說空白接觸..

因此檢查聯繫人姓名是否是第一次從它獲得索引之前空或不是。

相關問題