2012-09-23 146 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