view中setImportantForAccessibility调用时莫名其妙的空指针异常

来源:互联网 发布:当代传播 大数据 高涛 编辑:程序博客网 时间:2024/05/30 23:00

如下:

E/AndroidRuntime(11807): FATAL EXCEPTION: main
E/AndroidRuntime(11807): java.lang.NullPointerException
E/AndroidRuntime(11807):     at com.android.launcher2.HideFromAccessibilityHelper.restoreImportantForAccessibilityHelper(HideFromAccessibilityHelper.java:68)
E/AndroidRuntime(11807):     at com.android.launcher2.HideFromAccessibilityHelper.onChildViewRemoved(HideFromAccessibilityHelper.java:102)
E/AndroidRuntime(11807):     at android.view.ViewGroup.onViewRemoved(ViewGroup.java:3371)
E/AndroidRuntime(11807):     at android.view.ViewGroup.removeDetachedView(ViewGroup.java:3939)
E/AndroidRuntime(11807):     at android.widget.AbsListView.access$5700(AbsListView.java:93)
E/AndroidRuntime(11807):     at android.widget.AbsListView$RecycleBin.pruneScrapViews(AbsListView.java:6800)
E/AndroidRuntime(11807):     at android.widget.AbsListView$RecycleBin.scrapActiveViews(AbsListView.java:6779)
E/AndroidRuntime(11807):     at android.widget.GridView.layoutChildren(GridView.java:1273)
E/AndroidRuntime(11807):     at android.widget.AbsListView.onLayout(AbsListView.java:2037)
E/AndroidRuntime(11807):     at android.view.View.layout(View.java:14099)
E/AndroidRuntime(11807):     at android.view.ViewGroup.layout(ViewGroup.java:4464)
E/AndroidRuntime(11807):     at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1021)
E/AndroidRuntime(11807):     at android.view.View.layout(View.java:14099)
E/AndroidRuntime(11807):     at android.view.ViewGroup.layout(ViewGroup.java:4464)
E/AndroidRuntime(11807):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
E/AndroidRuntime(11807):     at android.view.View.layout(View.java:14099)
E/AndroidRuntime(11807):     at android.view.ViewGroup.layout(ViewGroup.java:4464)
E/AndroidRuntime(11807):     at com.android.launcher2.ShortcutAndWidgetContainer.onLayout(ShortcutAndWidgetContainer.java:124)
E/AndroidRuntime(11807):     at android.view.View.layout(View.java:14099)
E/AndroidRuntime(11807):     at android.view.ViewGroup.layout(ViewGroup.java:4464)
E/AndroidRuntime(11807):     at com.android.launcher2.CellLayout.onLayout(CellLayout.java:1031)
E/AndroidRuntime(11807):     at android.view.View.layout(View.java:14099)
E/AndroidRuntime(11807):     at android.view.ViewGroup.layout(ViewGroup.java:4464)
E/AndroidRuntime(11807):     at com.android.launcher2.PagedView.onLayout(PagedView.java:680)
E/AndroidRuntime(11807):     at com.android.launcher2.Workspace.onLayout(Workspace.java:1358)
E/AndroidRuntime(11807):     at android.view.View.layout(View.java:14099)
E/AndroidRuntime(11807):     at android.view.ViewGroup.layout(ViewGroup.java:4464)
E/AndroidRuntime(11807):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
E/AndroidRuntime(11807):     at com.android.launcher2.DragLayer.onLayout(DragLayer.java:410)
E/AndroidRuntime(11807):     at android.view.View.layout(View.java:14099)
E/AndroidRuntime(11807):     at android.view.ViewGroup.layout(ViewGroup.java:4464)
E/AndroidRuntime(11807):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
E/AndroidRuntime(11807):     at android.view.View.layout(View.java:14099)
E/AndroidRuntime(11807):     at android.view.ViewGroup.layout(ViewGroup.java:4464)
E/AndroidRuntime(11807):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
E/AndroidRuntime(11807):     at android.view.View.layout(View.java:14099)
E/AndroidRuntime(11807):     at android.view.ViewGroup.layout(ViewGroup.java:4464)
E/AndroidRuntime(11807):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1670)
E/AndroidRuntime(11807):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1528)
E/AndroidRuntime(11807):     at android.widget.LinearLayout.onLayout(LinearLayout.java:1441)
E/AndroidRuntime(11807):     at android.view.View.layout(View.java:14099)
E/AndroidRuntime(11807):     at android.view.ViewGroup.layout(ViewGroup.java:4464)
E/AndroidRuntime(11807):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
E/AndroidRuntime(11807):     at android.view.View.layout(View.java:14099)
E/AndroidRuntime(11807):     at android.view.ViewGroup.layout(ViewGroup.java:4464)
E/AndroidRuntime(11807):     at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2183)
E/AndroidRuntime(11807):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1947)
E/AndroidRuntime(11807):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1139)
E/AndroidRuntime(11807):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4879)
E/AndroidRuntime(11807):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:776)
E/AndroidRuntime(11807):     at android.view.Choreographer.doCallbacks(Choreographer.java:579)
E/AndroidRuntime(11807):     at android.view.Choreographer.doFrame(Choreographer.java:548)
E/AndroidRuntime(11807):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:762)
E/AndroidRuntime(11807):     at android.os.Handler.handleCallback(Handler.java:725)
E/AndroidRuntime(11807):     at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(11807):     at android.os.Looper.loop(Looper.java:153)
E/AndroidRuntime(11807):     at android.app.ActivityThread.main(ActivityThread.java:5299)
E/AndroidRuntime(11807):     at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(11807):     at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(11807):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
E/AndroidRuntime(11807):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
E/AndroidRuntime(11807):     at dalvik.system.NativeStart.main(Native Method)
E/AppErrorDialog(  545): Failed to get ILowStorageHandle instance


HideFromAccessibilityHelper.java第68行代码如下

private void restoreImportantForAccessibilityHelper(View v) {v.setImportantForAccessibility(mPreviousValues.get(v));//第68行            mPreviousValues.remove(v);
调试几遍发现v不为空,mPreviousValues这个hashMap(View, Integer)也不为空,可是报了空指针异常。

原来View.java中该方法定义如下:

public void setImportantForAccessibility(int mode) {        if (mode != getImportantForAccessibility()) {            mPrivateFlags2 &= ~PFLAG2_IMPORTANT_FOR_ACCESSIBILITY_MASK;            mPrivateFlags2 |= (mode << PFLAG2_IMPORTANT_FOR_ACCESSIBILITY_SHIFT)                    & PFLAG2_IMPORTANT_FOR_ACCESSIBILITY_MASK;            notifyAccessibilityStateChanged();        }    }

其中参数为int,而我们上述使用中参数却为Integer,这必然有一个类型转换的问题,当hashMap中的Integer对象为空是,这一隐藏的类型转换导致了空指针异常,这也是为什么查不出哪个值为空的原因。

一段测试程序如下:

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Integer a = null;int b = a;}

FATAL EXCEPTION: main
E/AndroidRuntime(12233): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sean.test/com.sean.test.MainActivity}: java.lang.NullPointerException
E/AndroidRuntime(12233):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2306)
E/AndroidRuntime(12233):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2358)
E/AndroidRuntime(12233):     at android.app.ActivityThread.access$600(ActivityThread.java:156)
E/AndroidRuntime(12233):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1340)
E/AndroidRuntime(12233):     at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(12233):     at android.os.Looper.loop(Looper.java:153)
E/AndroidRuntime(12233):     at android.app.ActivityThread.main(ActivityThread.java:5299)
E/AndroidRuntime(12233):     at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(12233):     at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(12233):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
E/AndroidRuntime(12233):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
E/AndroidRuntime(12233):     at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(12233): Caused by: java.lang.NullPointerException
E/AndroidRuntime(12233):     at com.sean.test.MainActivity.onCreate(MainActivity.java:17)
E/AndroidRuntime(12233):     at android.app.Activity.performCreate(Activity.java:5122)
E/AndroidRuntime(12233):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1081)
E/AndroidRuntime(12233):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2270)
E/AndroidRuntime(12233):     ... 11 more
E/AppErrorDialog(  545): Failed to get ILowStorageHandle instance