2015-09-27 116 views
-1

这是一个调用getDetails类的程序。当它调用getDetails时就会出现这个错误。我试着getDetails代码sepretaly,它的工作原理。但是当我从这个类中调用它时,它会向我显示这个错误。我上传错误的图片浏览: 空指针异常错误eclipse

它认为这关系到这条线:

Cursor names = context.getContentResolver().query(uri, projection, null, null, null); 

代码

public class SmsFilter extends BroadcastReceiver { 
SharedPreferences preferences = null ; 
    Context context = null; 


@Override 
public void onReceive(Context context, Intent intent) { 



    preferences = context.getSharedPreferences("modes",Context.MODE_PRIVATE); 


    if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { 

     Bundle extras = intent.getExtras(); 
     if (extras != null) { 
      Object[] pdus = (Object[])extras.get("pdus"); 

      if (pdus.length < 1) return; // Invalid SMS. Not sure that it's possible. 

      StringBuilder sb = new StringBuilder(); 
      String sender = null; 
      for (int i = 0; i < pdus.length; i++) { 
       SmsMessage message = SmsMessage.createFromPdu((byte[]) pdus[i]); 
       if (sender == null) sender = message.getOriginatingAddress(); 
       String text = message.getMessageBody(); 
       if (text != null) sb.append(text); 
      } 
      if (preferences.getBoolean("enable", true)==false) { 



      if (preferences.getBoolean("all", true)){ abortBroadcast();} 



      else if (preferences.getBoolean("blacklist", true)){ 

      boolean str=Search.search(sender); 

       if (sender != null && str ==true) { 


       abortBroadcast(); 

      } 

      } 
      else if (preferences.getBoolean("contact", true)&& getDetails(sender)){ 
       abortBroadcast(); 


      } 






      else {}} 


      return; 
     } 
    } 

    // ... 
} 


boolean getDetails(String Phonumber){ 
    Boolean answer=null; 

    Log.i("sss", "to here"); 


Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 
    // ContentResolver cr = getContentResolver(); 


// Cursor cur = context.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); 
String[] projection = new String[] {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
        ContactsContract.CommonDataKinds.Phone.NUMBER }; 



Log.i("sss", "to here1"); 



Cursor names = context.getContentResolver().query(uri, projection, null, null, null); 



//int indexName = names.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); 
int indexNumber = names.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); 
Log.i("sss", "to here n"+indexNumber); 


names.moveToFirst(); 
do { 

    Log.i("sss", names.getString(indexNumber)); 

     String number = names.getString(indexNumber); 

    number.replace(" ", ""); 
    if(number.startsWith("0")){ 
     number="+98"+context.getString(1,number.length());} 

    if(Phonumber.startsWith("0")){ 
    Phonumber="+98"+Phonumber.substring(1,Phonumber.length());} 



    if (number.equals(Phonumber)) 

    {answer=true;} 

} while (names.moveToNext()); 
return answer; 
} 

} 
+0

你可以清除看到的错误报告...错误说,NPE在blocker.activity.contactsearch.search(contactsearch.java:37),所以我觉得错误是在行 - >布尔str = Search.search(发件人);或者你可以点击报告中的那一行,它将带你到地点 –

回答

1

你宣布你的类的顶部成员,但从来没有给它一个有效的参考:

Context context = null; 

由于成功H,context仍然null当你拨打:

Cursor names = context.getContentResolver().query(uri, projection, null, null, null); 

因此,NullPointerException

选项1
确保你要么要么指定一个有效的引用(在onReceive()):

this.context = context; 

选项2
或者在基准作为方法参数传递给getDetails()

else if (preferences.getBoolean("contact", true) && getDetails(context, sender)) { ... } 

方法itse然后将LF是这样的:

boolean getDetails(Context context, String Phonumber) { ... } 

如果你使用第二个选项,您可以删除,上面写着Context context = null;行,因为它不再使用。你的IDE可能已经暗示了这一点(我知道Android Studio肯定会这样做,但对Eclipse没有把握)。

+0

知府!!!!!!!!!! –

+0

@sarasara:那为什么不接受? –