-3

私は 3 つのフラグメントを取得しました。2 つは player1 と player2 で、1 つは tictactoelayout で、もう 1 つは基本的にそれらすべてのフラグメントを連結した TicTacToeGame です。各プレーヤーフラグメントで、TicTacToeGame メソッドにアクセスしようとしています

public class PlayerTurn1 extends Fragment  {

public View onCreateView(LayoutInflater inflater,
    ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.playerturn1, container, false);
        return view;
    }

    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

       extras = getArguments();

       player1 = new ArrayList<String>(extras.getStringArrayList("player1"));

        row = (EditText) getActivity().findViewById(R.id.rowP1);
        column = (EditText) getActivity().findViewById(R.id.columnP1);
        p1Name = (TextView) getActivity().findViewById(R.id.p1NameInfo);
        p1Icon = (TextView) getActivity().findViewById(R.id.p1IconInfo);
        doneP1 = (Button) getActivity().findViewById(R.id.doneP1);
        resetP1 = (Button) getActivity().findViewById(R.id.resetP2);

        setPlayer();

        doneP1.setOnClickListener(new View.OnClickListener() {          
            public void onClick(View v) {   

                if(checkField() != false)
                {
                    String rowValueStr = row.getText().toString();
                    String colValueStr = column.getText().toString();
                    int rowValueInt = Integer.parseInt(rowValueStr);
                    int colValueInt = Integer.parseInt(colValueStr);

                    myObject.playTicTacToe(rowValueInt, colValueInt);
                    myObject.whosTurn = 2;
                    callPlayer2Fragment();

                }


            }
        });
    }
}

これが私の Player2 フラグメントです。

public class PlayerTurn2 extends Fragment{
 public View onCreateView(LayoutInflater inflater,
    ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.playerturn2, container, false);

        return view;
    }

    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);


        extras = getArguments();

        player2 = new ArrayList<String>(extras.getStringArrayList("player2"));

        p2Name = (TextView) getActivity().findViewById(R.id.p2NameInfo);
        p2Icon = (TextView) getActivity().findViewById(R.id.p2IconInfo);
        row = (EditText) getActivity().findViewById(R.id.rowP2);
        column = (EditText) getActivity().findViewById(R.id.columnP2);
        doneP2 = (Button) getActivity().findViewById(R.id.doneP2);
        resetP2 = (Button) getActivity().findViewById(R.id.resetP2);

        setPlayer();

        doneP2.setOnClickListener(new View.OnClickListener() {          
            public void onClick(View v) {   

                if(checkField() != false)
                {
                    String rowValueStr = row.getText().toString();
                    String colValueStr = column.getText().toString();
                    int rowValueInt = Integer.parseInt(rowValueStr);
                    int colValueInt = Integer.parseInt(colValueStr);

                    myObject2.playTicTacToe(rowValueInt, colValueInt);
                    myObject2.whosTurn = 1;
                    callPlayer1Fragment();
                }
            }
        });
    }
}

TicTacToeGame にある私のメソッドは次のとおりです。

public void playTicTacToe(int r, int c)
    {
        if(whosTurn == 1)
            images[r-1][c-1].setText(player1.get(1));  
        else
            images[r-1][c-1].setText(player2.get(1));
        return;

    }

丸太の猫は次のとおりです。

03-26 15:11:31.770: E/AndroidRuntime(5632): java.lang.NullPointerException
03-26 15:11:31.770: E/AndroidRuntime(5632):     at As2.packageTK.TicTacToeGame.playTicTacToe(TicTacToeGame.java:153)
03-26 15:11:31.770: E/AndroidRuntime(5632):     at As2.packageTK.PlayerTurn1$1.onClick(PlayerTurn1.java:64)

64行目:

myObject.playTicTacToe(rowValueInt, colValueInt);

153行目:

images[r-1][c-1].setText("O");

これを解決する方法はありますか?

編集

    TextView[][] images;
image1 = (TextView) this.findViewById(R.id.Image1);
        image2 = (TextView) this.findViewById(R.id.Image2);
        image3 = (TextView) this.findViewById(R.id.Image3);
        image4 = (TextView) this.findViewById(R.id.Image4);
        image5 = (TextView) this.findViewById(R.id.Image5);
        image6 = (TextView) this.findViewById(R.id.Image6);
        image7 = (TextView) this.findViewById(R.id.Image7);
        image8 = (TextView) this.findViewById(R.id.Image8);
        image9 = (TextView) this.findViewById(R.id.Image9);

    images = new TextView[][]{ {image1, image2, image3},
                       {image4, image5, image6},
                       {image7, image8, image9} }

;

4

2 に答える 2

3

これを解決する方法はありますか?

はい。コードを注意深く分析します。

このステートメントでは、NPE がスローされると言います。

images[r-1][c-1].setText("O");
  • も も もrですcのでintありえませnull
  • images配列null. _ _
  • images[r-1]サブアレイnull. _ _
  • images[r-1][c-1]オブジェクトnull. _ _

(それが例外がスローされた場所でない場合は、NPE がスローされた実際のコードで同様の分析を行います。)

したがって、NPE の直接の原因として考えられるのは、正確に 3 つです。デバッガーまたはトレース プリントを使用して、上記のどれが実際にnull. 次に、配列を作成、初期化、および更新するコードを見て、それらのnull値がどこから来ているかを調べます。次に、問題を修正します。

関連するコードが質問に含まれていないため、null のソースを見つけることはできません。

于 2013-03-26T15:39:55.960 に答える
1

LogCat から:

java.lang.NullPointerException
    at As2.packageTK.TicTacToeGame.playTicTacToe(TicTacToeGame.java:153)

問題が発生していることがわかりますplayTicTacToe()(具体的には 153 行目ですが、これがどの行であるかを特定する方法はありません)。これが完全な方法である場合:

public void playTicTacToe(int r, int c)
{
    if(whosTurn == 1)
        images[r-1][c-1].setText(player1.get(1));  
    else
        images[r-1][c-1].setText(player2.get(1));
    return;
}

次に、、、images[r-1][c-1]およびplayer1/またはplayer2null です... デバッガーは、どの値が null であるかを私たちよりもはるかに速く把握するのに役立ち、変数を初期化するだけです。
NPEはそれほど悪いものではありません。

于 2013-03-26T15:38:33.033 に答える