45 votes

NullPointerException qui ne pointe pas vers une ligne dans mon code

Je suis en train de travailler sur un jeu où le joueur peut faire glisser et déposer des choses autour de l'écran. J'ai une méthode qui me permet de simuler un glisser/déposer de l'événement pour tous les objets que le joueur peut se déplacer autour. Pour ce déplacement, je suis en fait en laissant le point de vue qu'ils ont touché où il est, et la création d'une nouvelle ImageView avec et le réglage de la dessinés à la drawingCache de l'touché à vue, puis en déplaçant nouvellement créé ImageView autour de l'écran à la suite de leur doigt. Lorsque vous relâchez votre doigt (baisse de la vue) je suis appelant myLayout.remove(movingImg); de descendre au bas de l'écran. Je rencontre un problème où, si je commence une simulation d'événement glisser manuellement, puis prenez l'un des autres articles, je suis un pointeur null sur la monmodèle.remove() appel, ici, c'est la trace de Journal:

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)

La trace n'a pas de point de n'importe où à l'intérieur de mon activité. L'exception est lancée à chaque fois que l'on tente de l'appeler monmodèle.remove() sur la simulation en faisant glisser la vue. J'ai entouré cette ligne avec un try / catch, mais qui n'a rien fait. Je sais que c'est la ligne c'est de me donner de la difficulté parce que si j'en commentaire puis je ne suis pas une exception, mais, évidemment, puis de mon point de vue n'est jamais supprimée de l'écran. Je suis la construction de cette application sur un Motorola xoom, je ne suis pas sûr si ce est un dispositif problème spécifique ou pas bien. Personne ne sait ce qui pourrait se passer ici?

C'est la où la .removeView() est appelé à partir de:

        @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;
        }
    });

C'est à l'intérieur d'un AnimationListener pour le traduire animation qui est un déplacement de mon ImageView à partir de là que ça commence à l'endroit où ça s'est passé'

98voto

jptsetung Points 3204

Android fera une exception lorsque vous modifiez la hiérarchie des vues dans animationEnd.

Tout ce que vous avez à faire est de reporter votre appel comme suit:

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

0voto

Justin Waugh Points 1901

Ma conjecture est que c'est un multi threading problème. Il ressemble à l'intérieur android rendu de la boucle est de la rencontre d'un pointeur null en raison du fait que vous avez retiré l'image à partir d'un autre thread. L'INTERFACE utilisateur Android cadre est mono-thread et toutes les modifications apportées à l'INTERFACE utilisateur qui doit se produire dans le thread de l'INTERFACE utilisateur. Si tel est le problème que vous rencontrez, alors vous pouvez simplement déléguer votre appel pour le thread d'INTERFACE utilisateur.

Il y a quelques infos ici: android threading

0voto

rajath Points 5325

Pouvez-vous essayer ceci, pour vous assurer que simulateMovingImg est présent

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X