【问题标题】:Unable to sort string array in android, Arrays.sort causes fatal exception无法在android中对字符串数组进行排序,Arrays.sort导致致命异常
【发布时间】:2015-10-24 21:11:04
【问题描述】:

我正在尝试从手机中读取所有联系人并尝试对联系人姓名进行排序,但调用此方法 Arrays.sort(mystring, String.CASE_INSENSITIVE_ORDER) 会导致致命异常。

我不知道问题是什么..? 有没有其他方法可以在 android(java) 中对字符串数组进行排序

public class ContactActivity extends Activity {

/**
 * @param args
 */
public static HashMap<String, String> myHash = new HashMap<String, String>();
public static String[] mystring = new String[10000];
protected static int i = 0;
protected Context context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.contacts_screen);

    ActionBar actionBar = getActionBar();
    actionBar.setDisplayShowHomeEnabled(true);
    actionBar.setHomeButtonEnabled(true);
    actionBar.setDisplayHomeAsUpEnabled(true);

    //*************************************************
    getContactNumbers(this);
    Log.i("Aravinth", "...before sorting....");
    Arrays.sort(mystring, String.CASE_INSENSITIVE_ORDER);
    //*******************************************************

    final ListView contactLV = (ListView)findViewById(R.id.contactsListView);
    MyListAdapter listViewAdapter = new MyListAdapter(this,R.layout.list_items,myHash,mystring);
    contactLV.setAdapter(listViewAdapter);
    /*
    Arrays.sort(contactData);
    for(int i =0;i<contactData.length;i++)
    {
        Log.d("Aravinth",contactData[i]);
    }
    */
}

public static void getContactNumbers(Context context) {
    String contactNumber = null;
    String nameOfContact = null;
    Uri imageUri;
    int i = 0;

    ContentResolver cr = context.getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,null, null, null);
        if (cur.getCount() > 0) {
            while (cur.moveToNext()) {
                String id = cur.getString(cur.getColumnIndex(BaseColumns._ID));
                nameOfContact = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));


                if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                    Cursor phones = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID+ " = ?", new String[] { id },null);

                    while (phones.moveToNext()) {
                        if(phones.getInt(phones.getColumnIndex(Phone.TYPE)) == Phone.TYPE_MOBILE)
                        {
                            contactNumber = phones.getString(phones.getColumnIndex(Phone.NUMBER));
                            mystring[i] = nameOfContact;
                            myHash.put(nameOfContact, nameOfContact);
                            Log.i("Aravinth", "...Contact Name ...." + mystring[i] + "...contact Number..." + contactNumber);
                        }
                    }
                    phones.close();
                }
                i++;
            }
        }// end of contact name cursor
        cur.close();
}

}

这是日志

08-03 00:45:25.247: I/Aravinth(676): ...before sorting....
08-03 00:45:25.267: D/AndroidRuntime(676): Shutting down VM
08-03 00:45:25.267: W/dalvikvm(676): threadid=1: thread exiting with uncaught exception (group=0x40a9b210)
08-03 00:45:25.287: E/AndroidRuntime(676): FATAL EXCEPTION: main
08-03 00:45:25.287: E/AndroidRuntime(676): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.arsenic.test01/com.arsenic.test01.ContactActivity}: java.lang.NullPointerException
08-03 00:45:25.287: E/AndroidRuntime(676):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)
08-03 00:45:25.287: E/AndroidRuntime(676):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
08-03 00:45:25.287: E/AndroidRuntime(676):  at android.app.ActivityThread.access$600(ActivityThread.java:127)
08-03 00:45:25.287: E/AndroidRuntime(676):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
08-03 00:45:25.287: E/AndroidRuntime(676):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-03 00:45:25.287: E/AndroidRuntime(676):  at android.os.Looper.loop(Looper.java:137)
08-03 00:45:25.287: E/AndroidRuntime(676):  at android.app.ActivityThread.main(ActivityThread.java:4448)
08-03 00:45:25.287: E/AndroidRuntime(676):  at java.lang.reflect.Method.invokeNative(Native Method)
08-03 00:45:25.287: E/AndroidRuntime(676):  at java.lang.reflect.Method.invoke(Method.java:511)
08-03 00:45:25.287: E/AndroidRuntime(676):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
08-03 00:45:25.287: E/AndroidRuntime(676):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
08-03 00:45:25.287: E/AndroidRuntime(676):  at dalvik.system.NativeStart.main(Native Method)
08-03 00:45:25.287: E/AndroidRuntime(676): Caused by: java.lang.NullPointerException
08-03 00:45:25.287: E/AndroidRuntime(676):  at java.lang.String$CaseInsensitiveComparator.compare(String.java:89)
08-03 00:45:25.287: E/AndroidRuntime(676):  at java.lang.String$CaseInsensitiveComparator.compare(String.java:71)
08-03 00:45:25.287: E/AndroidRuntime(676):  at java.util.TimSort.binarySort(TimSort.java:261)
08-03 00:45:25.287: E/AndroidRuntime(676):  at java.util.TimSort.sort(TimSort.java:204)
08-03 00:45:25.287: E/AndroidRuntime(676):  at java.util.TimSort.sort(TimSort.java:169)
08-03 00:45:25.287: E/AndroidRuntime(676):  at java.util.Arrays.sort(Arrays.java:2038)
08-03 00:45:25.287: E/AndroidRuntime(676):  at com.arsenic.test01.ContactActivity.onCreate(ContactActivity.java:45)
08-03 00:45:25.287: E/AndroidRuntime(676):  at android.app.Activity.performCreate(Activity.java:4465)
08-03 00:45:25.287: E/AndroidRuntime(676):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
08-03 00:45:25.287: E/AndroidRuntime(676):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)
08-03 00:45:25.287: E/AndroidRuntime(676):  ... 11 more
08-03 00:45:26.718: I/Process(676): Sending signal. PID: 676 SIG: 9

【问题讨论】:

标签: android arrays string sorting


【解决方案1】:

08-03 00:45:25.287:E/AndroidRuntime(676):原因:java.lang.NullPointerException

基本上,您正在创建一个大数组,然后尝试对其进行排序 -> NPE。

更正 使用 ArrayList 代替 [] 数组,您可以使用 Collections.sort 对其进行排序

【讨论】:

    【解决方案2】:

    您正在 MainThread 上调用 getContactNumbers(this)。

    你必须使用 Asynctask 来获取联系人,并且在它的 postExecute 方法中你应该调用

    Arrays.sort(mystring, String.CASE_INSENSITIVE_ORDER);
    MyListAdapter listViewAdapter = new MyListAdapter(this,R.layout.list_items,myHash,mystring);
    contactLV.setAdapter(listViewAdapter);
    

    【讨论】:

    • 正确但与崩溃无关。
    • 在 mystring 中你没有数据,你正在对其进行排序。
    • 它工作得很好,但我需要将上下文作为参数传递,这在 AsyncTask() 中是不可能的......怎么能做到这一点..?
    • 您可以在 AsyncTask 中使用 ContactActivity.this 代替上下文
    【解决方案3】:

    更多日志会有所帮助,但这里有两个想法可能会有所帮助:

    1. 我不是 100% 确定这一点,但您可能想检查一下:您初始化数组的大小为 10000,这是否意味着所有条目都初始化为 null?因此,如果您没有 10000 或更多的联系人,该数组将有尾随 null,对吗?

    2. 可能是这样

      nameOfContact = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

      为某些联系人提供null。至少文档没有明确排除null作为返回值。

      你可以检查一下

      if (nameOfContact == null) { nameOfContact = ""; }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      相关资源
      最近更新 更多