arrayList字符串搜索:NullPointerException

时间:2014-06-20 03:06:32

标签: java android arraylist nullpointerexception singleton

我会尽力解释这个问题。 (我仍然是Java和Android的新手)

问题

我试图通过搜索arrayList将传入的数字字符串与Contact对象的数字字符串进行比较。

背景

我能够将来自arrayList的Contacts加载到不同的视图(ListView,textView等),所以我知道方法和对象正在工作。我遇到了这个新类( RingerService )。

设计

我在名为 contactStorage 的类中有一个联系人数组列表。 它可以用于显示不同的视图:

//constructor with context to access project resources and instantiate from JSONfile to arrayList 
private ContactStorage(Context appContext){
    mAppContext = appContext;
    mSerializer = new ContactJSONer(mAppContext, FILENAME);

    try{
        mContacts = mSerializer.loadContacts();
    }catch (Exception e){
        mContacts = new ArrayList<Contact>();
        Log.e(TAG, "No contacts available, creating new list: ", e);
    }
}

//get method to only return one instance from the constructor
public static ContactStorage get(Context c){
    if (sContactStorage == null){
        sContactStorage = new ContactStorage(c.getApplicationContext());
    }
    return sContactStorage;
}

//for ringer service to find matching number
public Contact getContactNumber(String number){
    for (Contact c: mContacts){
        if(c.getNumber().replaceAll("[^0-9]", "").equals(number))
            return c;
    }
    return null;
}

当我在下面的 RingerService 类中调用 get 方法时,就会出现问题。具体来说,我在 onCallStateChanged 上得到NullPointerException:

 private Contact mContact;
private String number;
private Context mContext;

    @Override
   public void onCreate(){
       mTelephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
       mPhoneStateListener = new PhoneStateListener(){
           // state change 
           @Override
           public void onCallStateChanged(int state, String incomingNumber){
               if (state == 1 ){ 
                   try{
                        mContact = ContactStorage.get(mContext).getContactNumber(incomingNumber);
                        number = mContact.getNumber();
                        Log.d(TAG, state+" received an incoming number: " + number);
                    }catch(Exception e){
                        Log.d(TAG, " exception: " + e);
                    }
               } else {
                   Log.d(TAG, state+" number not found" + incomingNumber);
               }
           }   
       };
       super.onCreate();
   }

Troubeshooting:

1 我删除了对数字的引用( number = mContact.getNumber(); ) - 在这种情况下程序运行正常。我可以向模拟器发送测试调用,并使用测试编号arg正确显示日志消息。我认为这可能是数组搜索在 getContactNumber 类中的工作方式。它永远不会找到匹配的值,导致null吗?

2 我还认为,因为这是一个服务,所以在调用ContactStorage.get(Context c)方法时,我在某种程度上没有获得正确的上下文。

第3 如果我设置了我的mContact引用并且没有找到数字匹配,那么mContact = null;仍然让程序运行?

2 个答案:

答案 0 :(得分:4)

您正尝试在==中使用c.getNumber() == number匹配字符串,这将检查两个对象引用是否等于

使用c.getNumber().equals(number)

答案 1 :(得分:0)

感谢您的建议。事实证明,当在Eclipse中测试传入的电话呼叫到仿真器设备时,GUI字段只接受没有空格或连字符的数字:(1112221122)

由于我的联系对象的号码字段是通过android的CONTACT_URI分配的,因此格式保存为字符串(###)### - #### 。这将永远不会匹配,从而导致nullPointerException错误。我更新了 getContactNumber 方法,以便为任何潜在匹配的长字符串替换此格式。

然后我在 RingerService 方法上为任何RuntimeException添加了一个catch。现在一切正常。

出于好奇,有没有人知道真实传入电话号码的格式?