原因:java.lang.NullPointerException:尝试在空对象引用上调用虚方法 'boolean java.lang.String.isEmpty()'

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.isEmpty()' on a null object reference

此代码在 android 9 以下的版本上运行良好,但在 9 及以上版本上崩溃:

public class Utils_String {

    public static String prepareContacts(Context ctx,String number) {
        if (number.isEmpty())
            return "";
        
        String preparednumbers=number.trim();
        preparednumbers=preparednumbers.replace(" ","");
        preparednumbers=preparednumbers.replace("(","");
        preparednumbers=preparednumbers.replace(")","");
        if(preparednumbers.contains("+")) {
            preparednumbers=preparednumbers.replace(preparednumbers.substring(0,3),""); //to remove country code
        }
        preparednumbers=preparednumbers.replace("-","");
        return preparednumbers;
    }

}

我调用utils_Strings的代码:

recyclerAdapter.setListener(new Adapter_incoming.itemClickListener() {
    @Override
    public void onClick(View v, int position) {
        if(mensu){
            Contacts_data contacts1= (Contacts_data) searchPeople.get(position);
            String records= GetContact.getRecordsList(v.getContext(),recordings,"IN",contacts1);
            if(Build.VERSION.SDK_INT>18){
                GetContact.openMaterialSheetDialog(getLayoutInflater(),position,records, Utils_String.prepareContacts(ctx,contacts1.getNumber()));
            }else{
                GetContact.showDialog(v.getContext(),records,contacts1);
            }
        }else {
            Contacts_data contacts= (Contacts_data) realrecordingcontacts.get(position);
            String records= GetContact.getRecordsList(v.getContext(),recordings,"IN",contacts);
            if(Build.VERSION.SDK_INT>18){
                GetContact.openMaterialSheetDialog(getLayoutInflater(),position,records, Utils_String.prepareContacts(ctx,contacts.getNumber()));
            }else{
                GetContact.showDialog(v.getContext(),records,contacts);
            }
        }
        GetContact.setItemrefresh(new GetContact.refresh() {
            @Override
            public void refreshList(boolean var) {
                if(var)
                    recyclerAdapter.notifyDataSetChanged();
            }
        });
    }
});

你必须检查数字是否为空,然后你可以检查值是否为空。

正如@Jon Skeet 评论的那样,解决这个问题的最佳方法是,使用 OR 为 null 添加新条件

public static String prepareContacts(Context ctx, String number){
   if(number == null || number.isEmpty()){
      return "";
   }else{
      String preparednumbers=number.trim();
      preparednumbers=preparednumbers.replace(" ","");
      preparednumbers=preparednumbers.replace("(","");
      preparednumbers=preparednumbers.replace(")","");
      if(preparednumbers.contains("+")){
            preparednumbers=preparednumbers.replace(preparednumbers.substring(0,3),""); //to remove country code
      }
      preparednumbers=preparednumbers.replace("-","");
      return preparednumbers;
   }
}