Android应用程序在Choreographer中出现NullPointerException而崩溃

13

我有以下的代码,试图在ListView中创建一个简单的ListAdapter(我之前已经让这段代码能够工作了,而且这是我唯一更改的地方):

public BuddyListAdapter(Context context, HashMap<String, Buddy> hashMap) {
    buddyList = new ArrayList<Buddy>(hashMap.values());
    mInflater = LayoutInflater.from(context);
    ctx = context;
}

在逐步调试时没有任何反应,但在运行时,当我创建一个空的ArrayList时,在ChoreoGrapher.doCallbacks中会发生NullPointerException

public BuddyListAdapter(Context context, HashMap<String, Buddy> hashMap) {
    buddyList = new ArrayList<Buddy>();
    mInflater = LayoutInflater.from(context);
    ctx = context;
}

什么是ChoreoGrapher,为什么它会导致我的应用程序崩溃?

我完全不知道问题出在哪里,也不知道如何找出问题所在。Eclipse调试器或崩溃信息并没有真正提供帮助。

整个堆栈跟踪如下:

Thread [<1> main] (Suspended (exception NullPointerException))  
    Choreographer.doCallbacks(int, long) line: 558  
    Choreographer.doFrame(long, int) line: 525  
    Choreographer$FrameDisplayEventReceiver.run() line: 711 
    Handler.handleCallback(Message) line: 615   
    Choreographer$FrameHandler(Handler).dispatchMessage(Message) line: 92   
    Looper.loop() line: 137 
    ActivityThread.main(String[]) line: 4745    
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
    Method.invoke(Object, Object...) line: 511  
    ZygoteInit$MethodAndArgsCaller.run() line: 786  
    ZygoteInit.main(String[]) line: 553 
    NativeStart.main(String[]) line: not available [native method]  

我在主活动中也有一个Handler。当它没有执行任何操作时,listview就不会崩溃。但是,在打开listview之前,我从中删除了所有回调。


你能在Handler实例中设置断点以确保它们没有被调用吗? - Craig Otis
@craig 每隔5秒钟就会调用 Handler,当我在它第一次触发后立即打开 ListViewActivity 时,应用程序会立即崩溃。 - Bart Friederichs
3
在Eclipse中允许崩溃发生,然后使用LogCat查看堆栈跟踪的后面部分(“Caused by”)以找出根本原因。 - CommonsWare
我突然遇到了这个问题,只在Android 4.4上出现。我的应用程序之前运行良好,现在却崩溃了。非常难以找出问题所在...! - Peterdk
1
@Peterdk,就像CommonsWare所说的那样,让崩溃继续并在LogCat中查看堆栈跟踪。这将为您提供更多信息(向下查看跟踪)。 - Bart Friederichs
显示剩余4条评论
3个回答

30

我的应用程序只在Android 4.4上出现这个bug。

在调试器中,它显示与提问者相同的消息。然而,在非调试模式下,DDMS中的完整堆栈跟踪如下:

完整堆栈跟踪:

11-13 16:34:53.088: E/AndroidRuntime(1964): FATAL EXCEPTION: main
11-13 16:34:53.088: E/AndroidRuntime(1964): Process: appname, PID: 1964
11-13 16:34:53.088: E/AndroidRuntime(1964): java.lang.NullPointerException
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.widget.TextView.makeNewLayout(TextView.java:6124)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.widget.TextView.onMeasure(TextView.java:6419)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.view.View.measure(View.java:16458)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.widget.Spinner.setUpChild(Spinner.java:632)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.widget.Spinner.makeView(Spinner.java:585)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.widget.Spinner.getBaseline(Spinner.java:431)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1262)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:590)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.view.View.measure(View.java:16458)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.view.View.measure(View.java:16458)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.view.View.measure(View.java:16458)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.view.View.measure(View.java:16458)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2289)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.view.View.measure(View.java:16458)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1914)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1111)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1293)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5582)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.view.Choreographer.doCallbacks(Choreographer.java:562)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.view.Choreographer.doFrame(Choreographer.java:532)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.os.Handler.handleCallback(Handler.java:733)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.os.Handler.dispatchMessage(Handler.java:95)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.os.Looper.loop(Looper.java:137)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at android.app.ActivityThread.main(ActivityThread.java:4998)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at java.lang.reflect.Method.invokeNative(Native Method)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at java.lang.reflect.Method.invoke(Method.java:515)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
11-13 16:34:53.088: E/AndroidRuntime(1964):     at dalvik.system.NativeStart.main(Native Method)

浏览TextView的4.4源代码,在第6124行,发现这是由于省略时缺少布局参数引起的。这很奇怪,因为代码在ListAdapter中失败,而在getView中不提供布局参数。

我曾经使用android.R.layout.simple_spinner_item来填充标准Spinner项目。看起来这个项目使用了ellipsing。因此,在我的getView中,我现在调用:

view.setEllipsize(null);

这解决了我在Android 4.4上面的问题。

编辑

事实证明问题不是省略,而是在getView中视图的充气不当。

inflater.inflate(android.R.layout.simple_spinner_item, null);//WRONG
inflater.inflate(android.R.layout.simple_spinner_item, parent, false);//GOOD
请注意,在适配器中附加子视图时,您需要将false提供给不立即将视图附加到父视图的选项,否则会出现错误。
当您正确地进行填充时,您无需将ellipseSize设置为null。因为当您以正确的方式填充时,使用父视图处理LayoutParams,使椭圆代码不会引发NullPointerException
因此,请正确填充,然后您就不必再担心了。

非常好!谢谢你。 - Christopher Gertz

7

我在另一个应用程序中遇到了同样的问题。这似乎是由于列表适配器中的getView未处理的异常引起的。


2
我曾经调用了findViewById(R.id.WRONGITEM),但是WRONGITEM并不是我应该访问的内容。 - gonzobrains

0

在代码中操作视图时,请检查可能存在无效类型转换的地方。我在这行代码中遇到了完全相同的错误

picture.setLayoutParams(new ViewGroup.LayoutParams(50, 50));

编舞者出现了这个错误:"android.view.ViewGroup$LayoutParams 无法转换为 android.widget.LinearLayout$LayoutParams"

将其更改为

picture.setLayoutParams(new android.widget.LinearLayout.LayoutParams(50, 50));

修复问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接