7

Tôi nhận được một số lạ NullPointerException. Không có chỉ dẫn trong mã của tôi. Ngoài ra tôi biết rằng ứng dụng của tôi mang lại cho NullPointerException này chỉ trên:NullPointerException tại android.widget.AbsListView.contentFits (AbsListView.java:722)

Nhà sản xuất: Sony Ericsson
sản phẩm: MT11i_1256-3856
Android phiên bản: 2.3.4

Bất kỳ ý tưởng?

java.lang.NullPointerException 
    at android.widget.AbsListView.contentFits(AbsListView.java:722) 
    at android.widget.AbsListView.onTouchEvent(AbsListView.java:2430) 
    at android.widget.ListView.onTouchEvent(ListView.java:3447) 
    at android.view.View.dispatchTouchEvent(View.java:3952) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:995) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1034) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1034) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1034) 
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1034) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1711) 
    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1145) 
    at android.app.Activity.dispatchTouchEvent(Activity.java:2096) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1695) 
    at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2217) 
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1901) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:130) 
    at android.app.ActivityThread.main(ActivityThread.java:3701) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624) 
    at dalvik.system.NativeStart.main(Native Method) 

Trả lời

8

Tôi có rất nhiều ngoại lệ tương tự trong ứng dụng của mình. Tôi đã làm một số nghiên cứu trong mã nguồn hệ điều hành Android, và đưa ra một kết luận - đây là lỗi của hệ điều hành Android Gingerbread và dưới đây, và nó đã được cố định trong Ice Cream Sandwich.

Nếu bạn muốn biết thêm chi tiết, hãy nhìn vào mã nguồn của phương pháp AbsListView.contentFits trong cây nguồn Gingerbread:

private boolean contentFits() { 
    final int childCount = getChildCount(); 
    if (childCount != mItemCount) { 
     return false; 
    } 

    return getChildAt(0).getTop() >= 0 && getChildAt(childCount - 1).getBottom() <= mBottom; 
} 

Rõ ràng rằng phương pháp này sẽ ném NullPointerException nếu kêu gọi danh sách trống, vì getChildAt(0) sẽ trở lại NULL. Điều này đã được khắc phục trong ICS source tree

private boolean contentFits() { 
    final int childCount = getChildCount(); 
    if (childCount == 0) return true; 
    if (childCount != mItemCount) return false; 

    return getChildAt(0).getTop() >= mListPadding.top && 
      getChildAt(childCount - 1).getBottom() <= getHeight() - mListPadding.bottom; 
} 

Như bạn thấy, có séc dành cho (childCount == 0).

Về một workaround cho vấn đề này - bạn có thể khai báo các lớp học của bạn riêng MyListView extends ListView, phương pháp ghi đè onTouchEvent và gọi vòm để super.onTouchEvent() với một khối try-catch. Tất nhiên bạn sẽ cần phải sử dụng lớp ListView tùy chỉnh của bạn ở tất cả các địa điểm trong ứng dụng của bạn.

Các vấn đề liên quan