2

我正在尝试编写一个小井字游戏。现在我到了一个点,它抛出了一个我无法解释的 nullPointerException。任何人都可以帮忙吗?

代码主要活动:

    package de.android.pali;

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;

    public class TicTacToeMenu extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tic_tac_toe_menu);

    final Button createGame = (Button)findViewById(R.id.newGameButton);

    final Intent newGame = new Intent(TicTacToeMenu.this, newGame.class);

    createGame.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            startActivity(newGame);


        }
    });


}


}

第二个活动的代码:

package de.android.pali;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.TextView;

public class newGame extends TicTacToeMenu{

int turn = 1;
int[] felder = new int[9];
TextView ergebnis = (TextView)findViewById(R.id.winners);

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.game);

    final ImageButton feld1 = (ImageButton)findViewById(R.id.feld1);
    final ImageButton feld2 = (ImageButton)findViewById(R.id.feld2);
    final ImageButton feld3 = (ImageButton)findViewById(R.id.feld3);
    final ImageButton feld4 = (ImageButton)findViewById(R.id.feld4);
    final ImageButton feld5 = (ImageButton)findViewById(R.id.feld5);
    final ImageButton feld6 = (ImageButton)findViewById(R.id.feld6);
    final ImageButton feld7 = (ImageButton)findViewById(R.id.feld7);
    final ImageButton feld8 = (ImageButton)findViewById(R.id.feld8);
    final ImageButton feld9 = (ImageButton)findViewById(R.id.feld9);




    feld1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {


            if(turn==1){
            feld1.setBackgroundResource(R.drawable.kreis);
            turn = 0;
            felder[0] = 1;
            }
            else{
                feld1.setBackgroundResource(R.drawable.kreuz);
                turn = 1;
                felder[0] = 0;
            }
        }


    });

    feld2.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            if(turn==1){
                feld2.setBackgroundResource(R.drawable.kreis);
                turn = 0;
                felder[1] = 1;
                }
                else{
                        feld2.setBackgroundResource(R.drawable.kreuz);
                    felder[1] = 0;
                }
        }
    });

    feld3.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            if(turn==1){
                feld3.setBackgroundResource(R.drawable.kreis);
                turn = 0;
                felder[2] = 1;
                }
                else{
                    feld3.setBackgroundResource(R.drawable.kreuz);
                    turn = 1;
                    felder[2] = 0;
                };

        }
    });

    feld4.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            if(turn==1){
                feld4.setBackgroundResource(R.drawable.kreis);
                turn = 0;
                felder[3] = 1;
                }
                else{
                    feld4.setBackgroundResource(R.drawable.kreuz);
                    felder[3] = 0;
                }

        }
    });

    feld5.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            if(turn==1){
                feld5.setBackgroundResource(R.drawable.kreis);
                turn = 0;
                felder[4] = 1;
                }
                else{
                    feld5.setBackgroundResource(R.drawable.kreuz);
                    turn = 1;
                    felder[4] = 0;
                }

        }
    });

    feld6.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            if(turn==1){
                feld6.setBackgroundResource(R.drawable.kreis);
                turn = 0;
                felder[5] = 1;
                }
                else{
                    feld6.setBackgroundResource(R.drawable.kreuz);
                    turn = 1;
                    felder[5] = 0;
                }

        }
    });

    feld7.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            if(turn==1){
                feld7.setBackgroundResource(R.drawable.kreis);
                turn = 0;
                felder[6] = 1;
                }
                else{
                    feld7.setBackgroundResource(R.drawable.kreuz);
                    turn = 1;
                    felder[6] = 0;
                }

        }
    });

    feld8.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            if(turn==1){
                feld8.setBackgroundResource(R.drawable.kreis);
                turn = 0;
                felder[7] = 1;
                }
                else{
                    feld8.setBackgroundResource(R.drawable.kreuz);
                    turn = 1;
                    felder[7] = 0;
                }

        }
    });

    feld9.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            if(turn==1){
                feld9.setBackgroundResource(R.drawable.kreis);
                turn = 0;
                felder[8] = 1;
                }
                else{
                    feld9.setBackgroundResource(R.drawable.kreuz);
                    turn = 1;
                    felder[8] = 0;
                }

        }
    });


}

public int getTurn() {
    int whois = turn;
    return whois;
}

public void checkWinner(){
    if(felder[0]==1 & felder[1]==1 & felder[2]==1){
        ergebnis.setText(R.string.kreuz);

    }else
    { }

}
}

日志猫:

    11-13 12:26:55.579: I/ActivityManager(88): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=de.android.pali/.TicTacToeMenu} from pid 772
11-13 12:26:55.589: W/WindowManager(88): Failure taking screenshot for (180x300) to layer 21005
11-13 12:26:55.629: D/AndroidRuntime(772): Shutting down VM
11-13 12:26:55.639: D/dalvikvm(772): GC_CONCURRENT freed 101K, 77% free 485K/2048K, paused 1ms+1ms
11-13 12:26:55.649: D/dalvikvm(772): Debugger has detached; object registry had 1 entries
11-13 12:26:55.659: D/dalvikvm(782): Not late-enabling CheckJNI (already on)
11-13 12:26:55.669: I/AndroidRuntime(772): NOTE: attach of thread 'Binder Thread #3' failed
11-13 12:26:55.719: I/ActivityManager(88): Start proc de.android.pali for activity de.android.pali/.TicTacToeMenu: pid=782 uid=10045 gids={}
11-13 12:26:55.948: W/NetworkManagementSocketTagger(88): setKernelCountSet(10045, 1) failed with errno -2
11-13 12:26:56.449: I/Process(88): Sending signal. PID: 782 SIG: 3
11-13 12:26:56.449: I/dalvikvm(782): threadid=3: reacting to signal 3
11-13 12:26:56.569: I/dalvikvm(782): Wrote stack traces to '/data/anr/traces.txt'
11-13 12:26:56.819: D/gralloc_goldfish(782): Emulator without GPU emulation detected.
11-13 12:26:56.868: I/ActivityManager(88): Displayed de.android.pali/.TicTacToeMenu: +1s263ms (total +37s914ms)
11-13 12:26:57.088: W/NetworkManagementSocketTagger(88): setKernelCountSet(10009, 0) failed with errno -2
11-13 12:27:00.828: I/ActivityManager(88): START {cmp=de.android.pali/.newGame} from pid 782
11-13 12:27:00.838: W/WindowManager(88): Failure taking screenshot for (180x300) to layer 21010
11-13 12:27:00.868: D/AndroidRuntime(782): Shutting down VM
11-13 12:27:00.868: W/dalvikvm(782): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
11-13 12:27:00.889: E/AndroidRuntime(782): FATAL EXCEPTION: main
11-13 12:27:00.889: E/AndroidRuntime(782): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{de.android.pali/de.android.pali.newGame}: java.lang.NullPointerException
11-13 12:27:00.889: E/AndroidRuntime(782):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1880)
11-13 12:27:00.889: E/AndroidRuntime(782):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
11-13 12:27:00.889: E/AndroidRuntime(782):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
11-13 12:27:00.889: E/AndroidRuntime(782):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
11-13 12:27:00.889: E/AndroidRuntime(782):  at android.os.Handler.dispatchMessage(Handler.java:99)
11-13 12:27:00.889: E/AndroidRuntime(782):  at android.os.Looper.loop(Looper.java:137)
11-13 12:27:00.889: E/AndroidRuntime(782):  at android.app.ActivityThread.main(ActivityThread.java:4424)
11-13 12:27:00.889: E/AndroidRuntime(782):  at java.lang.reflect.Method.invokeNative(Native Method)
11-13 12:27:00.889: E/AndroidRuntime(782):  at java.lang.reflect.Method.invoke(Method.java:511)
11-13 12:27:00.889: E/AndroidRuntime(782):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-13 12:27:00.889: E/AndroidRuntime(782):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-13 12:27:00.889: E/AndroidRuntime(782):  at dalvik.system.NativeStart.main(Native Method)
11-13 12:27:00.889: E/AndroidRuntime(782): Caused by: java.lang.NullPointerException
11-13 12:27:00.889: E/AndroidRuntime(782):  at android.app.Activity.findViewById(Activity.java:1794)
11-13 12:27:00.889: E/AndroidRuntime(782):  at de.android.pali.newGame.<init>(newGame.java:13)
11-13 12:27:00.889: E/AndroidRuntime(782):  at java.lang.Class.newInstanceImpl(Native Method)
11-13 12:27:00.889: E/AndroidRuntime(782):  at java.lang.Class.newInstance(Class.java:1319)
11-13 12:27:00.889: E/AndroidRuntime(782):  at android.app.Instrumentation.newActivity(Instrumentation.java:1023)
11-13 12:27:00.889: E/AndroidRuntime(782):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1871)
11-13 12:27:00.889: E/AndroidRuntime(782):  ... 11 more
11-13 12:27:00.929: W/ActivityManager(88):   Force finishing activity de.android.pali/.newGame
11-13 12:27:00.929: W/ActivityManager(88):   Force finishing activity de.android.pali/.TicTacToeMenu
11-13 12:27:01.359: I/Process(88): Sending signal. PID: 782 SIG: 3
11-13 12:27:01.359: I/dalvikvm(782): threadid=3: reacting to signal 3
11-13 12:27:01.379: I/dalvikvm(782): Wrote stack traces to '/data/anr/traces.txt'
11-13 12:27:01.439: W/ActivityManager(88): Activity pause timeout for ActivityRecord{415b08b0 de.android.pali/.newGame}
11-13 12:27:01.439: I/Process(88): Sending signal. PID: 782 SIG: 3
11-13 12:27:01.439: I/dalvikvm(782): threadid=3: reacting to signal 3
11-13 12:27:01.459: I/dalvikvm(782): Wrote stack traces to '/data/anr/traces.txt'
11-13 12:27:01.488: W/NetworkManagementSocketTagger(88): setKernelCountSet(10009, 1) failed with errno -2
11-13 12:27:01.748: W/NetworkManagementSocketTagger(88): setKernelCountSet(10045, 0) failed with errno -2
11-13 12:27:02.169: I/Process(782): Sending signal. PID: 782 SIG: 9
11-13 12:27:02.178: I/ActivityManager(88): Process de.android.pali (pid 782) has died.
11-13 12:27:02.178: W/InputDispatcher(88): channel '415c53c8 de.android.pali/de.android.pali.TicTacToeMenu (server)' ~ Consumer closed input channel or an error occurred.  events=0x8
11-13 12:27:02.178: E/InputDispatcher(88): channel '415c53c8 de.android.pali/de.android.pali.TicTacToeMenu (server)' ~ Channel is unrecoverably broken and will be disposed!
11-13 12:27:02.189: I/WindowManager(88): WIN DEATH: Window{415c53c8 de.android.pali/de.android.pali.TicTacToeMenu paused=true}
11-13 12:27:02.189: W/InputDispatcher(88): Attempted to unregister already unregistered input channel '415c53c8 de.android.pali/de.android.pali.TicTacToeMenu (server)'
11-13 12:27:02.199: I/WindowManager(88): WINDOW DIED Window{415c53c8 de.android.pali/de.android.pali.TicTacToeMenu paused=true}
11-13 12:27:02.359: W/InputManagerService(88): Got RemoteException sending setActive(false) notification to pid 782 uid 10045
11-13 12:27:11.749: W/ActivityManager(88): Activity destroy timeout for  ActivityRecord{415a28b8 de.android.pali/.TicTacToeMenu}
11-13 12:27:11.749: W/ActivityManager(88): Activity destroy timeout for ActivityRecord{415b08b0 de.android.pali/.newGame}

我希望任何人都可以提供帮助:)

4

3 回答 3

2

把这一行:

TextView ergebnis = (TextView)findViewById(R.id.winners);

之后setContentView()

findViewById()方法仅在您的内容设置后才有效。您的应用程序正在尝试以您实施的这种方式在类加载期间找到视图。

PS:有一个Java约定,规定类名必须以大写字母开头。您应该将“newGame”重命名为“NewGame”。

于 2012-11-13T11:35:05.990 回答
0

logcat 的这一行显示了代码中错误的位置:

11-13 12:27:00.889: E/AndroidRuntime(782):  at de.android.pali.newGame.<init>(newGame.java:13)

这似乎与此有关:

feld1.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
....

出于某种原因,feld1当您调用final ImageButton feld1 = (ImageButton)findViewById(R.id.feld1);. 您确定这是该布局文件(游戏)上 ImageButton 的正确 ID 吗?

于 2012-11-13T11:37:10.410 回答
0

嗨,兄弟,只需尝试使用 try{ ... } 和 catch{ ... } 编写您的代码,这样您就可以轻松找到异常。

于 2013-05-06T13:21:03.943 回答