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

如下:

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值