2012-09-23 145 views
1

我有一個android應用程序,從web服務獲取HTTP響應,我將其處理成一個字符串數組。我比嘗試在ListView中顯示這些字符串。他們不需要點擊任何操作,只需顯示並可滾動。
運行時,一切都很順利,但是當我嘗試向下滾動顯示的項目數量(因爲沒有更多字符串顯示在列表中)時,我得到一個NullPointerException。很顯然,我一定在做錯事。
我不太明白。我已經寫了一個類似的例子作爲測試,它工作得很好。該示例中的列表只是滾動並在沒有更多項顯示時停止。我能想到的唯一區別是,在原始應用程序上,數組是在一個線程上創建的,並且該線程使用處理程序運行可運行的程序以在gui上顯示列表。
Android ListView拋出空指針異常

時獲取的字符串,並命令他們到陣列的線程來顯示完成後,他將運行使用處理程序的代碼:

scoreList = (ListView) findViewById(R.id.scorelist); 
    ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,scoreResult); 
    scoreList.setAdapter(myAdapter); 

不是試圖滾動比底低時,應用程序崩潰。這是亞行logcat錯誤:

D/AndroidRuntime( 864): Shutting down VM 
W/dalvikvm( 864): threadid=1: thread exiting with uncaught exception (group=0x4 
001d800) 
E/AndroidRuntime( 864): FATAL EXCEPTION: main 
E/AndroidRuntime( 864): java.lang.NullPointerException 
E/AndroidRuntime( 864):  at android.widget.ArrayAdapter.createViewFromRes 
ource(ArrayAdapter.java:355) 
E/AndroidRuntime( 864):  at android.widget.ArrayAdapter.getView(ArrayAdap 
ter.java:323) 
E/AndroidRuntime( 864):  at android.widget.AbsListView.obtainView(AbsList 
View.java:1294) 
E/AndroidRuntime( 864):  at android.widget.ListView.makeAndAddView(ListVi 
ew.java:1727) 
E/AndroidRuntime( 864):  at android.widget.ListView.fillDown(ListView.jav 
a:652) 
E/AndroidRuntime( 864):  at android.widget.ListView.fillGap(ListView.java 
:623) 
E/AndroidRuntime( 864):  at android.widget.AbsListView.trackMotionScroll(
AbsListView.java:2944) 
E/AndroidRuntime( 864):  at android.widget.AbsListView.onTouchEvent(AbsLi 
stView.java:2065) 
E/AndroidRuntime( 864):  at android.widget.ListView.onTouchEvent(ListView 
.java:3315) 
E/AndroidRuntime( 864):  at android.view.View.dispatchTouchEvent(View.jav 
a:3766) 
E/AndroidRuntime( 864):  at android.view.ViewGroup.dispatchTouchEvent(Vie 
wGroup.java:897) 
E/AndroidRuntime( 864):  at android.view.ViewGroup.dispatchTouchEvent(Vie 
wGroup.java:936) 
E/AndroidRuntime( 864):  at android.view.ViewGroup.dispatchTouchEvent(Vie 
wGroup.java:936) 
E/AndroidRuntime( 864):  at android.view.ViewGroup.dispatchTouchEvent(Vie 
wGroup.java:936) 
E/AndroidRuntime( 864):  at com.android.internal.policy.impl.PhoneWindow$ 
DecorView.superDispatchTouchEvent(PhoneWindow.java:1671) 
E/AndroidRuntime( 864):  at com.android.internal.policy.impl.PhoneWindow. 
superDispatchTouchEvent(PhoneWindow.java:1107) 
E/AndroidRuntime( 864):  at android.app.Activity.dispatchTouchEvent(Activ 
ity.java:2086) 
E/AndroidRuntime( 864):  at com.android.internal.policy.impl.PhoneWindow$ 
DecorView.dispatchTouchEvent(PhoneWindow.java:1655) 
E/AndroidRuntime( 864):  at android.view.ViewRoot.handleMessage(ViewRoot. 
java:1785) 
E/AndroidRuntime( 864):  at android.os.Handler.dispatchMessage(Handler.ja 
va:99) 
E/AndroidRuntime( 864):  at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime( 864):  at android.app.ActivityThread.main(ActivityThrea 
d.java:4627) 
E/AndroidRuntime( 864):  at java.lang.reflect.Method.invokeNative(Native 
Method) 
E/AndroidRuntime( 864):  at java.lang.reflect.Method.invoke(Method.java:5 
21) 
E/AndroidRuntime( 864):  at com.android.internal.os.ZygoteInit$MethodAndA 
rgsCaller.run(ZygoteInit.java:868) 
E/AndroidRuntime( 864):  at com.android.internal.os.ZygoteInit.main(Zygot 
eInit.java:626) 
E/AndroidRuntime( 864):  at dalvik.system.NativeStart.main(Native Method) 

W/ActivityManager( 59): Force finishing activity memo.ori.friend/.Highscores 

W/ActivityManager( 59): Activity pause timeout for HistoryRecord{4503fed0 memo 
.ori.friend/.Highscores} 
W/WindowManager( 59): No window to dispatch pointer action 1 
W/ActivityManager( 59): Launch timeout has expired, giving up wake lock! 
W/ActivityManager( 59): Activity idle timeout for HistoryRecord{45023af0 memo. 
ori.friend/.MemoFriendActivity} 
D/dalvikvm( 261): GC_EXPLICIT freed 45 objects/2128 bytes in 108ms 
W/ActivityManager( 59): Activity destroy timeout for HistoryRecord{4503fed0 me 
mo.ori.friend/.Highscores} 
D/SntpClient( 59): request time failed: java.net.SocketException: Address fami 
ly not supported by protocol 
I/Process ( 864): Sending signal. PID: 864 SIG: 9 
I/ActivityManager( 59): Process memo.ori.friend (pid 864) has died. 
I/WindowManager( 59): WIN DEATH: Window{45077ce0 memo.ori.friend/memo.ori.frie 
nd.MemoFriendActivity paused=false} 
I/WindowManager( 59): WIN DEATH: Window{4507cf60 memo.ori.friend/memo.ori.frie 
nd.Highscores paused=false} 
I/UsageStats( 59): Unexpected resume of com.android.launcher while already res 
umed in memo.ori.friend 
W/InputManagerService( 59): Got RemoteException sending setActive(false) notif 
ication to pid 864 uid 10044 
W/IInputConnectionWrapper( 126): showStatusIcon on inactive InputConnection 
D/SntpClient( 59): request time failed: java.net.SocketException: Address fami 
ly not supported by protocol 
+0

檢查xml文件中的id。列表視圖應該有「scorelist」作爲id。 – bashu

回答

2

當跑了,一切都被做了好了,但是當我嘗試向下滾動 以後,我要展示的項目數量(因爲沒有 更多的字符串顯示在列表中)我得到一個NullPointerException。 顯然我一定在做錯事。

這一例外來自具有傳遞到ArrayAdapter列表/陣列(scoreResult)在null值。這是因爲ArrayAdapter默認情況下會調用(在getView負責構建列表行的方法)toString方法對數據列表中的每個項目,如果該項目的類型不是CharSequence(您有String ),以獲得該項目的文本表示以顯示在該行中。

因此,檢查scoreResult列表/數組,並確保您沒有null值。我看到你談到了一個數組,確保數組的大小與數據所需的數據一樣大,如果它大於數據,那麼數據在其末尾處將會有null值。

1
request time failed: java.net.SocketException: Address fami 
ly not supported by protocol 

請檢查還有什麼,somethig不好。

NullPointerException它是初學者程序員簽名:它不驗證參數,他在一行寫入多個語句。在這種情況下,我會檢查scoreResult不爲空,但至少不爲空

+0

謝謝。我相信你是對的。 scoreResult充滿了值,但它的長度比actuacl值長,所以其餘部分都是空的。我敢打賭,這是造成問題的原因。很明顯。呸。謝謝! – user1555863