2011-11-07 145 views
0

我想在一個數組中的聯繫人的名稱和他們在另一個數組中的類型,但無法通過與空指針exception.here是我的代碼。我已經指出了我得到空指針異常的行。請幫助..提前感謝。獲得空指針異常?

package application.test; 
import android.app.Activity; 
import android.content.ContentResolver; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.os.Bundle; 
import android.provider.ContactsContract; 
import android.provider.ContactsContract.CommonDataKinds.Phone; 
import android.provider.ContactsContract.Contacts.Data; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.LinearLayout; 
import android.widget.ListView; 
import android.widget.RelativeLayout; 

public final class TestActivity extends Activity { 
String[] name; 
String[] phoneType; 
ListView lv; 
ListViewAdapter lva; 


    public static final String TAG = "ContactManager"; 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    Log.v(TAG, "Activity State: onCreate()"); 
    super.onCreate(savedInstanceState); 
    LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);   
    LinearLayout mainLayout=new LinearLayout(this); 
    mainLayout.setOrientation(LinearLayout.VERTICAL);    
    LayoutInflater layoutInflater = getLayoutInflater();   
    mainLayout.addView(layoutInflater.inflate(R.layout.main,null)); 
    mainLayout.addView(layoutInflater.inflate(R.layout.extra,null)); 

    this.addContentView(mainLayout, params); 

     lv = (ListView)findViewById(android.R.id.list); 
    lva = new ListViewAdapter(this,name,phoneType); 
    lv.setAdapter(lva); 
    testGetContacts(); 
} 


private void testGetContacts() { 

     ContentResolver cr = getContentResolver(); 

     String[] projection = new String[] { Data._ID, 
       ContactsContract.Contacts.DISPLAY_NAME, Phone.TYPE}; 

     Cursor cur = cr.query(ContactsContract.Data.CONTENT_URI, 
       projection, null, null, null); 


     if (cur != null && cur.moveToFirst()) { 

     try { 

      int indexID = cur.getColumnIndexOrThrow(ContactsContract.Contacts._ID); 
      int indexName = cur.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME); 
      int indexPhoneType = cur.getColumnIndexOrThrow(Phone.TYPE); 

      while (cur.moveToNext()) { 
      int i=1; 
       String id = cur.getString(indexID);  
//HERE LIES NULL POINTER EXCEPTION name[i] = cur.getString(indexName); 
//HERE TOO    phoneType[i] = cur.getString(indexPhoneType); 

      i++; 


       System.out.println(id + "\n"); 
       System.out.println(name + "\n"); 
       System.out.println(phoneType + "\n"); 


      } 


     } catch (SQLException sqle) { 
      //handling exception  
     } finally { 
     if (!cur.isClosed()) { 
      cur.close(); 
     }  
    } 

     } 

} 
} 
+1

請提供logcat輸出 – Vladimir

+1

無視您的'name'和'phoneType'未初始化,所以它們爲空 – Vladimir

+0

使您的列表視圖如下:lv =(ListView)findViewById(R.id.listview); – Hiral

回答

0

使用前初始化String[]名稱。 你可以這樣做:

name=new String[cur.getCount()]; 
String s=""; 
while (cur.moveToNext()) { 

    int i=1; 
    String id = cur.getString(indexID);  
    name[i] = cur.getString(indexName); 
    phoneType[i] = cur.getString(indexPhoneType);   

    //System.out.println(id + "\n"); 
    //System.out.println(name + "\n"); 
    //System.out.println(phoneType + "\n"); 

    s=s+"id="+id+" name="+name[i]+" phoneType="+phoneType[i]+"\n"; 
    i++; 
} 
Toast.makeText(getApplicationContext(),i+" - "+s).show(); 

編輯:

創建佈局文件夾中的XML文件。

main.xml中

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" android:orientation="vertical" >  

    <ListView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:id="@+id/listview" 
     android:cacheColorHint="#0000" 
     /> 
</LinearLayout> 
現在

TestActivity.class

public final class TestActivity extends Activity { 

String[] name; 
String[] phoneType; 
ListView lv; 
String s[]; 
public static final String TAG = "ContactManager"; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.id.main);   

    testGetContacts(); 

    lv = (ListView)findViewById(R.id.listview); 
    ArrayAdapter<String> sa=new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1,s); 
    lv.setAdapter(sa);   
} 


private void testGetContacts() { 

    ContentResolver cr = getContentResolver();  
    String[] projection = new String[] { Data._ID, 
       ContactsContract.Contacts.DISPLAY_NAME, Phone.TYPE};  
    Cursor cur = cr.query(ContactsContract.Data.CONTENT_URI, 
       projection, null, null, null);  

    if (cur != null && cur.moveToFirst()) { 

     try { 

      int indexID = cur.getColumnIndexOrThrow(ContactsContract.Contacts._ID); 
      int indexName = cur.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME); 
      int indexPhoneType = cur.getColumnIndexOrThrow(Phone.TYPE); 

      name=new String[cur.getCount()]; 
      s=new String[cur.getCount()]; 

      while (cur.moveToNext()) { 

       int i=1; 
       String id = cur.getString(indexID);  
       name[i-1] = cur.getString(indexName); 
       phoneType[i-1] = cur.getString(indexPhoneType);  


       String temp="id="+id+"-name="+name[i-1]+"-phoneType="+phoneType[i-1]; 
       s[i-1]=temp; 
       i++; 
}  

}

+0

好程序已運行,但無法檢索名稱和類型..blank屏幕是我所得到的。任何想法 –

+0

這是因爲你沒有在屏幕上顯示的東西。你會看到這個打印的東西使用System.out.println(「」);在CONSOL。嘗試使用Toast或TextView在屏幕上查看這些內容。 – Hiral

+0

請參閱答案中的編輯。我已經在列表視圖中顯示項目。 – Hiral

1

您沒有初始化您的String []名稱,因此當您嘗試訪問它時,會得到空指針異常。我會建議使用更有意義的變量名稱。 '名字'非常含糊。

+0

好程序已經運行但無法檢索名稱和類型..blank屏幕是我越來越。任何想法 –

+0

現在你正在處理一個完全不同的問題。我其他人已經回答了你的問題。你原來的問題是關於空引用異常。我建議試圖找到一些資源來了解你的新問題,並在需要時提出Stack Overflow的新問題。 –

+0

另外,它似乎是你問了兩件新事物。顯示和檢索是不同的操作。 –

1

您的姓名和手機數組尚未初始化。

String[] name = new String[EXPECTED_SIZE]; 
String[] phoneType = new String[EXPECTED_SIZE]; 

任何適當的IDE應該告訴你,在你嘗試運行它之前。你在使用Eclipse還是IntelliJ?你應該!

+0

好程序已經運行,但無法檢索名稱和類型..blank屏幕是我越來越。any idea –

0

你得到空指針,因爲你正在訪問錯誤的索引。

試試這個:

s=new String[cur.getCount()]; 
int i=1; 
while (cur.moveToNext()) {  

        String id = cur.getString(indexID);  
        name[i-1] = cur.getString(indexName); 
        phoneType[i-1] = cur.getString(indexPhoneType);  


        String temp="id="+id+"-name="+name[i-1]+"-phoneType="+phoneType[i-1]; 
        s[i-1]=temp; 
        i++; 
    } 

也代替lv=(ListView)findViewById(R.id.listview);lv=(ListView)findViewById(android.R.id.list);

你應該在這裏補充一個條件:

super.onCreate(savedInstanceState); 
    setContentView(R.layout.main);  
     testGetContacts(); 

if(s.length()>0) 
{ 
    lv = (ListView)findViewById(R.id.listview); 
    ArrayAdapter<String> sa=new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1,s); 
    lv.setAdapter(sa); 
} 
else 
{ 
    Toast.makeText(getApplicationContext(),"Nothing Found",Toast.LENGTH_SHORT).show(); 
} 
+0

我已經試過索引..still相同的異常和空值 –

+0

看到編輯的answer.make所有的變化,並告訴發生了什麼。 – Hiral

+0

運行時錯誤在if(s.length> 0).. –

0

試試這個,告訴我它幫助:

@Override 
     public void onCreate(Bundle savedInstanceState) 
     { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main);   

      lv = (ListView)findViewById(R.id.listview); 
      testGetContacts(); 
      ArrayAdapter<String> sa=new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1,s); 
       lv.setAdapter(sa);   

     }//method 


     private void testGetContacts() { 

      ContentResolver cr = getContentResolver();  
      String[] projection = new String[] { Data._ID, 
         ContactsContract.Contacts.DISPLAY_NAME, Phone.TYPE};  
      Cursor cur = cr.query(ContactsContract.Data.CONTENT_URI, 
         projection, null, null, null);  

      if (cur != null && cur.moveToFirst()) { 

       try { 

        int indexID = cur.getColumnIndexOrThrow(ContactsContract.Contacts._ID); 
        int indexName = cur.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME); 
        int indexPhoneType = cur.getColumnIndexOrThrow(Phone.TYPE); 

        name=new String[cur.getCount()]; 
        phoneType=new String[cur.getCount()]; 
        s=new String[cur.getCount()]; 
        int i=1; 
        while (cur.moveToNext()) { 

         String id = cur.getString(indexID);  
         name[i] = cur.getString(indexName); 
         phoneType[i] = cur.getString(indexPhoneType);  


         String temp="id="+id+"-name="+name[i]+"-phoneType="+phoneType[i]; 
         s[i-1]=temp; 
         i++;     
        }//while 
      ArrayAdapter<String> sa=new ArrayAdapter<String>(getApplicationContext(),    android.R.layout.simple_list_item_1,s); 
      lv.setAdapter(sa); 
      }catch(Exception e){ 

     e.printStackTrace();  
      }//catch 

      }//if 

     }//method 
+0

我試過了,能夠得到列表視圖,但不像我期望的那樣。首先,我得到了兩次我保存在AVD中的聯繫人,第二個事件名稱和phonetypes顯示了相同的內容,即聯繫人姓名。我無法獲得類型,即(家庭,工作)。 –