1. 程式人生 > >RN問題java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getId()'

RN問題java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getId()'

錯誤資訊:
java.lang.NullPointerException: Attempt to invoke virtual method ‘int android.view.View.getId()’ on a null object reference

java.lang.NullPointerException: Attempt to invoke virtual method ‘int android.view.View.getId()’ on a null object reference
at com.facebook.react.uimanager.NativeViewHierarchyManager.dropView(NativeViewHierarchyManager.java:536)
at com.facebook.react.uimanager.NativeViewHierarchyManager.manageChildren(NativeViewHierarchyManager.java:430)
at com.facebook.react.uimanager.UIViewOperationQueue$ManageChildrenOperation.execute(UIViewOperationQueue.java:179)
at com.facebook.react.uimanager.UIViewOperationQueue$1.run(UIViewOperationQueue.java:821)
at com.facebook.react.uimanager.UIViewOperationQueue.flushPendingBatches(UIViewOperationQueue.java:928)
at com.facebook.react.uimanager.UIViewOperationQueue.access2100

(UIViewOperationQueue.java:46)atcom.facebook.react.uimanager.UIViewOperationQueue2100(UIViewOperationQueue.java:46) at com.facebook.react.uimanager.UIViewOperationQueueDispatchUIFrameCallback.doFrameGuarded(UIViewOperationQueue.java:988)
at com.facebook.react.uimanager.GuardedFrameCallback.doFrame(GuardedFrameCallback.java:29)
at com.facebook.react.modules.core.ReactChoreographerR
eactChoreographerDispatcher.doFrame(ReactChoreographer.java:134)atcom.facebook.react.modules.core.ChoreographerCompatReactChoreographerDispatcher.doFrame(ReactChoreographer.java:134) at com.facebook.react.modules.core.ChoreographerCompat
FrameCallback1.doFrame(ChoreographerCompat.java:105)atandroid.view.Choreographer1.doFrame(ChoreographerCompat.java:105) at android.view.ChoreographerCallbackRecord.run(Choreographer.java:1024)
at android.view.Choreographer.doCallbacks(Choreographer.java:838)
at android.view.Choreographer.doFrame(Choreographer.java:766)
at android.view.ChoreographerFrameDisplayEventReceiver.run(Choreographer.java:1012)atandroid.os.Handler.handleCallback(Handler.java:789)atandroid.os.Handler.dispatchMessage(Handler.java:98)atandroid.os.Looper.loop(Looper.java:171)atandroid.app.ActivityThread.main(ActivityThread.java:6699)atjava.lang.reflect.Method.invoke(Method.java)atcom.android.internal.os.ZygoteFrameDisplayEventReceiver.run(Choreographer.java:1012) at android.os.Handler.handleCallback(Handler.java:789) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:171) at android.app.ActivityThread.main(ActivityThread.java:6699) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.ZygoteMethodAndArgsCaller.run(Zygote.java:246)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783)
java.lang.RuntimeException: java.lang.NullPointerException: Attempt to invoke virtual method ‘int android.view.View.getId()’ on a null object reference
at com.facebook.react.bridge.ReactContext.handleException(ReactContext.java:311)
at com.facebook.react.uimanager.GuardedFrameCallback.doFrame(GuardedFrameCallback.java:31)
at com.facebook.react.modules.core.ReactChoreographerReactChoreographerDispatcher.doFrame(ReactChoreographer.java:134)atcom.facebook.react.modules.core.ChoreographerCompatReactChoreographerDispatcher.doFrame(ReactChoreographer.java:134) at com.facebook.react.modules.core.ChoreographerCompatFrameCallback1.doFrame(ChoreographerCompat.java:105)atandroid.view.Choreographer1.doFrame(ChoreographerCompat.java:105) at android.view.ChoreographerCallbackRecord.run(Choreographer.java:1024)
at android.view.Choreographer.doCallbacks(Choreographer.java:838)
at android.view.Choreographer.doFrame(Choreographer.java:766)
at android.view.ChoreographerFrameDisplayEventReceiver.run(Choreographer.java:1012)atandroid.os.Handler.handleCallback(Handler.java:789)atandroid.os.Handler.dispatchMessage(Handler.java:98)atandroid.os.Looper.loop(Looper.java:171)atandroid.app.ActivityThread.main(ActivityThread.java:6699)atjava.lang.reflect.Method.invoke(Method.java)atcom.android.internal.os.ZygoteFrameDisplayEventReceiver.run(Choreographer.java:1012) at android.os.Handler.handleCallback(Handler.java:789) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:171) at android.app.ActivityThread.main(ActivityThread.java:6699) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.ZygoteMethodAndArgsCaller.run(Zygote.java:246)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783)

錯誤原因是:
RN的android原生bug,這個node_modules/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java檔案的dropView函式:

if (view instanceof ViewGroup && viewManager instanceof ViewGroupManager) {
      ViewGroup viewGroup = (ViewGroup) view;
      ViewGroupManager viewGroupManager = (ViewGroupManager) viewManager;
      for (int i = viewGroupManager.getChildCount(viewGroup) - 1; i >= 0; i--) {
        View child = viewGroupManager.getChildAt(viewGroup, i);
        if (mTagsToViews.get(child.getId()) != null) {
          dropView(child);
        }
      }
      viewGroupManager.removeAllViews(viewGroup);
    }

中的這段程式碼 if (mTagsToViews.get(child.getId()) != null) 判斷沒有對child做空判斷,導致問題可能出現崩潰。
解決