我有一个函数,它需要一个电话号码并使用Android提供商找到它的名字。
通常它工作正常,但有时我会收到错误:
CursorIndexOutOfBoundsException:请求索引 0,大小为 0。
现在这让我感到奇怪,因为我在尝试操作它之前检查光标是否为空,据我所知,如果没有找到结果,它应该返回 null。
完整的错误日志:
03-09 19:47:20.115: E/AndroidRuntime(12976): FATAL EXCEPTION: main
03-09 19:47:20.115: E/AndroidRuntime(12976): java.lang.RuntimeException: Unable to start service com.abg.a.ServiceFloatingButton@405469a0 with Intent { cmp=com.abg.a/.ServiceFloatingButton (has extras) }: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
03-09 19:47:20.115: E/AndroidRuntime(12976): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2056)
03-09 19:47:20.115: E/AndroidRuntime(12976): at android.app.ActivityThread.access$2800(ActivityThread.java:117)
03-09 19:47:20.115: E/AndroidRuntime(12976): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:998)
03-09 19:47:20.115: E/AndroidRuntime(12976): at android.os.Handler.dispatchMessage(Handler.java:99)
03-09 19:47:20.115: E/AndroidRuntime(12976): at android.os.Looper.loop(Looper.java:123)
03-09 19:47:20.115: E/AndroidRuntime(12976): at android.app.ActivityThread.main(ActivityThread.java:3691)
03-09 19:47:20.115: E/AndroidRuntime(12976): at java.lang.reflect.Method.invokeNative(Native Method)
03-09 19:47:20.115: E/AndroidRuntime(12976): at java.lang.reflect.Method.invoke(Method.java:507)
03-09 19:47:20.115: E/AndroidRuntime(12976): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
03-09 19:47:20.115: E/AndroidRuntime(12976): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
03-09 19:47:20.115: E/AndroidRuntime(12976): at dalvik.system.NativeStart.main(Native Method)
03-09 19:47:20.115: E/AndroidRuntime(12976): Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
03-09 19:47:20.115: E/AndroidRuntime(12976): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
03-09 19:47:20.115: E/AndroidRuntime(12976): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
03-09 19:47:20.115: E/AndroidRuntime(12976): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
03-09 19:47:20.115: E/AndroidRuntime(12976): at android.database.CursorWrapper.getString(CursorWrapper.java:135)
03-09 19:47:20.115: E/AndroidRuntime(12976): at com.abg.a.Contact.getInstanceFromPhoneBook(Contact.java:481)
03-09 19:47:20.115: E/AndroidRuntime(12976): at com.abg.a.ServiceFloatingButton.getContactFromCall(ServiceFloatingButton.java:181)
03-09 19:47:20.115: E/AndroidRuntime(12976): at com.abg.a.ServiceFloatingButton.onStartCommand(ServiceFloatingButton.java:48)
03-09 19:47:20.115: E/AndroidRuntime(12976): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2043)
03-09 19:47:20.115: E/AndroidRuntime(12976): ... 10 more
函数:
public static Contact getInstanceFromPhoneBook(String phoneNumber,ContentResolver resolver)
{
//TODO get the email, and a real priority
Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
String column[]=new String[]{PhoneLookup.DISPLAY_NAME};
Cursor cursor=resolver.query(uri, column,null,null,null);
Contact contact=null;
if (cursor!=null)
{
cursor.moveToFirst();
String name=cursor.getString(cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME));
String email="";
int priority=1;
contact=new Contact(name,"", phoneNumber, email,priority);
}
return contact;
}
谁能解释一下问题的根源?
像这样编辑代码,然后重试:
try {
if (cursor!=null && cursor.moveToFirst())
{
cursor.moveToFirst();
String name=cursor.getString(cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME));
String email="";
int priority=1;
contact=new Contact(name,"", phoneNumber, email,priority);
}
else{
contact=new Contact(null,null, null, null,null);
}
finally {
cursor.close();
}
db.close();
return contact;
我面临的相同错误,这段代码对我有用。