NullPointerException, которое не указывает на какую-либо строку в моем коде

Я работаю над игрой, в которой игрок может перетаскивать вещи вокруг экрана. У меня есть частный метод, который позволяет мне моделировать событие перетаскивания для любого элемента, который игрок может перемещать. Для перетаскивания я фактически оставляю представление, что они коснулись места, где он находится, и создав новый ImageView и установив drawable на drawCache из затронутого представления, а затем переместите этот вновь созданный ImageView вокруг экрана, следуя их пальцу. Когда вы отпустите палец (отбросьте представление), я myLayout.remove(movingImg); Чтобы снять его с экрана. У меня возникла проблема, когда, если я начну симулированное событие перетаскивания, а затем вручную возьму один из других элементов, я получаю нулевой указатель на вызов myLayout.remove (), вот трассировка из журнала:

 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): java.lang.NullPointerException 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2122) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.drawChild(ViewGroup.java:2506) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2123) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.drawChild(ViewGroup.java:2506) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2123) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.drawChild(ViewGroup.java:2506) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2123) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.drawChild(ViewGroup.java:2506) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2123) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.View.draw(View.java:9032) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.widget.FrameLayout.draw(FrameLayout.java:419) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1910) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewRoot.draw(ViewRoot.java:1608) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewRoot.performTraversals(ViewRoot.java:1329) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.view.ViewRoot.handleMessage(ViewRoot.java:1944) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.os.Handler.dispatchMessage(Handler.java:99) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.os.Looper.loop(Looper.java:126) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at android.app.ActivityThread.main(ActivityThread.java:3997) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at java.lang.reflect.Method.invokeNative(Native Method) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at java.lang.reflect.Method.invoke(Method.java:491) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 04-06 10:37:43.610: ERROR/AndroidRuntime(23203): at dalvik.system.NativeStart.main(Native Method) 

След не указывает нигде внутри моей деятельности. Исключение получается, когда оно пытается вызвать myLayout.remove () в симулированном представлении перетаскивания. Я окружил эту линию с помощью try / catch, но ничего не сделал. Я знаю, что это строка, которая вызывает у меня проблемы, потому что если я прокомментирую это, то я не получу исключения, но, очевидно, тогда мое представление никогда не будет удалено с экрана. Я создаю это приложение на Motorola xoom, я не уверен, что это проблема конкретного устройства или нет. Кто-нибудь знает, что может происходить здесь?

Это то, откуда вызывается .removeView ():

  @Override public void onAnimationEnd(Animation animation) { // TODO Auto-generated method stub Log.i(myTag, "Animation End"); try { //myLayout.removeView(simulateMovingImg); //This is the line that is throwing a null pointer simulateMovingImg.setVisibility(View.GONE); //This is how I am currently getting around the issue params = new LayoutParams(oneImg.getWidth(),oneImg.getHeight()); // While its moving it appears larger than normal simulateMovingImg.setLayoutParams(params); // so I set it back to the normal size if(whichTarget == true){ targetImg.setImageDrawable(simulateMovingImg.getDrawable()); //targetImg is one of the 'drop zones' so I set its // drawable to make it seem like the view was 'dropped' into this zone }else{ target1Img.setImageDrawable(simulateMovingImg.getDrawable()); // same with target1Img. } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } iAmDone = true; } }); 

Это внутри AnimationListener для трансляционной анимации, которая перемещает мой ImageView, откуда он начинает, где он «отбрасывается»,

Solutions Collecting From Web of "NullPointerException, которое не указывает на какую-либо строку в моем коде"

Android будет делать исключение, если вы измените иерархию представления в анимацииEnd.

Все, что вам нужно сделать, это отложить вызов следующим образом:

 @Override public void onAnimationEnd(Animation animation) { new Handler().post(new Runnable() { public void run() { myLayout.removeView(simulateMovingImg); } }); } 

Я предполагаю, что это проблема многопоточности. Похоже, что внутренний цикл рендеринга android встречает нулевой указатель из-за того, что вы удалили изображение из другого потока. Интерфейс Android UI является однопоточным, и все изменения в пользовательском интерфейсе должны происходить в потоке пользовательского интерфейса. Если это проблема, с которой вы сталкиваетесь, вы можете просто делегировать свой вызов потоку пользовательского интерфейса.

Здесь есть некоторая информация: андроидная резьба

Можете ли вы попробовать это, чтобы убедиться, что simulateMovingImg присутствует

  if (myLayout.indexOfChild() >= 0) { myLayout.removeView(simulateMovingImg); } 

Я встретил эту проблему после обновления appcompat-v7. Последняя стабильная версия вышеупомянутой зависимости теперь:

  compile 'com.android.support:appcompat-v7:23.2.1' 

Я немного изменил принятый ответ (он также работает), чтобы избежать обработчиков.

 @Override public void onAnimationEnd(Animation animation) { imageView.post(new Runnable() { @Override public void run() { layout.removeView(imageView); } }); }