2017-02-15 20 views
-1

私はtictactoeゲームのコードを書きましたが、このエラーが表示されます実行時:java.lang.NullPointerException:ヌルオブジェクトリファレンスで仮想メソッド 'android.os.Bundle android.content.Intent.getExtras()'を呼び出そうとしました

package com.tictactoe.ajaykulkarni.tictactoe; 

import android.content.pm.ActivityInfo; 
import android.os.Bundle; 
import android.util.Log; 
import android.support.design.widget.NavigationView; 
import android.support.v4.view.GravityCompat; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.Window; 
import android.widget.Button; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener { 

    //protected DrawerLayout mdrawerLayout; 

    /*Game plan*/ 
    private TicTacToeGame mGame; 

    // Buttons making up the board 
    private Button mBoardButtons[]; 
    private Button mNewGame; 

    // Various text displayed 
    private TextView mInfoTextView; 
    private TextView mPlayerOneCount; 
    private TextView mTieCount; 
    private TextView mPlayerTwoCount; 
    private TextView mPlayerOneText; 
    private TextView mPlayerTwoText; 

    private int mPlayerOneCounter = 0; 
    private int mTieCounter = 0; 
    private int mPlayerTwoCounter = 0; 

    private boolean mPlayerOneFirst = true; 
    private boolean mIsSinglePlayer = false; 
    private boolean mIsPlayerOneTurn = true; 
    private boolean mGameOver = false; 

    boolean mGameType = getIntent().getExtras().getBoolean("gameType"); 

    private Button[] getmBoardButtons() { 
     mBoardButtons = new Button[mGame.getBOARD_SIZE()]; 
     mBoardButtons[0] = (Button) findViewById(R.id.one); 
     mBoardButtons[1] = (Button) findViewById(R.id.two); 
     mBoardButtons[2] = (Button) findViewById(R.id.three); 
     mBoardButtons[3] = (Button) findViewById(R.id.four); 
     mBoardButtons[4] = (Button) findViewById(R.id.five); 
     mBoardButtons[5] = (Button) findViewById(R.id.six); 
     mBoardButtons[6] = (Button) findViewById(R.id.seven); 
     mBoardButtons[7] = (Button) findViewById(R.id.eight); 
     mBoardButtons[8] = (Button) findViewById(R.id.nine); 
     addListenerOnButton(); 

     // setup the textviews 
     mInfoTextView = (TextView) findViewById(R.id.information); 
     mPlayerOneCount = (TextView) findViewById(R.id.humanCount); 
     mTieCount = (TextView) findViewById(R.id.tiesCount); 
     mPlayerTwoCount = (TextView) findViewById(R.id.androidCount); 
     mPlayerOneText = (TextView) findViewById(R.id.human); 
     mPlayerTwoText = (TextView) findViewById(R.id.android); 

     // set the initial counter display values 
     mPlayerOneCount.setText(Integer.toString(mPlayerOneCounter)); 
     mTieCount.setText(Integer.toString(mTieCounter)); 
     mPlayerTwoCount.setText(Integer.toString(mPlayerTwoCounter)); 

     // create a new game object 
     mGame = new TicTacToeGame(); 

     // start a new game 
     startNewGame(mGameType); 

     return mBoardButtons; 
    } 

    //mBoardButtons = new Button[mGame.getBOARD_SIZE()]; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
       this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
     drawer.setDrawerListener(toggle); 
     toggle.syncState(); 

     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(this); 
    } 

    @Override 
    public void onBackPressed() { 
     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     if (drawer.isDrawerOpen(GravityCompat.START)) { 
      drawer.closeDrawer(GravityCompat.START); 
     } else { 
      super.onBackPressed(); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @SuppressWarnings("StatementWithEmptyBody") 
    @Override 
    public boolean onNavigationItemSelected(MenuItem item) { 
     // Handle navigation view item clicks here. 
     int id = item.getItemId(); 

     if (id == R.id.play) { 
      Log.d("DEBUG", "Play option selected!"); 
      DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
      drawer.closeDrawer(GravityCompat.START); 
      return true; 
     } else if (id == R.id.exit) { 
      Log.d("DEBUG", "Exit option selected!"); 
      MainActivity.this.finish(); 
     } 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     drawer.closeDrawer(GravityCompat.START); 
     return true; 
    } 

    public void addListenerOnButton(){ 

     mNewGame = (Button) findViewById(R.id.NewGame); 

     mNewGame.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       startNewGame(mIsSinglePlayer); 
      } 
     }); 
    } 

    // start a new game 
    // clears the board and resets all buttons/text 
    // sets game over to be false 
    private void startNewGame(boolean isSingle) 
    { 

     this.mIsSinglePlayer = isSingle; 

     mGame.clearBoard(); 

     for (int i = 0; i < mBoardButtons.length; i++) 
     { 
      mBoardButtons[i].setText(""); 
      mBoardButtons[i].setEnabled(true); 
      mBoardButtons[i].setOnClickListener(new ButtonClickListener(i)); 
      ///mBoardButtons[i].setBackgroundDrawable(getResources().getDrawable(R.drawable.blank)); 
     } 


     if (mIsSinglePlayer) 
     { 
      mPlayerOneText.setText("User:"); 
      mPlayerTwoText.setText("Android:"); 

      if (mPlayerOneFirst) 
      { 
       mInfoTextView.setText(R.string.first_human); 
       mPlayerOneFirst = false; 
      } 
      else 
      { 
       mInfoTextView.setText(R.string.turn_computer); 
       int move = mGame.getComputerMove(); 
       setMove(mGame.PLAYER_TWO, move); 
       mPlayerOneFirst = true; 
      } 
     } 

     mGameOver = false; 
    } 

    private class ButtonClickListener implements View.OnClickListener 
    { 
     int location; 

     public ButtonClickListener(int location) 
     { 
      this.location = location; 
     } 

     public void onClick(View view) 
     { 
      if (!mGameOver) 
      { 
       if (mBoardButtons[location].isEnabled()) 
       { 
        if (mIsSinglePlayer) 
        { 
         setMove(mGame.PLAYER_ONE, location); 

         int winner = mGame.checkForWinner(); 

         if (winner == 0) 
         { 
          mInfoTextView.setText(R.string.turn_computer); 
          int move = mGame.getComputerMove(); 
          setMove(mGame.PLAYER_TWO, move); 
          winner = mGame.checkForWinner(); 
         } 

         if (winner == 0) 
          mInfoTextView.setText(R.string.turn_human); 
         else if (winner == 1) 
         { 
          mInfoTextView.setText(R.string.result_tie); 
          mTieCounter++; 
          mTieCount.setText(Integer.toString(mTieCounter)); 
          mGameOver = true; 
         } 
         else if (winner == 2) 
         { 
          mInfoTextView.setText(R.string.result_human_wins); 
          mPlayerOneCounter++; 
          mPlayerOneCount.setText(Integer.toString(mPlayerOneCounter)); 
          mGameOver = true; 
         } 
         else 
         { 
          mInfoTextView.setText(R.string.result_android_wins); 
          mPlayerTwoCounter++; 
          mPlayerTwoCount.setText(Integer.toString(mPlayerTwoCounter)); 
          mGameOver = true; 
         } 
        } 
        else 
        { 
         if (mIsPlayerOneTurn) 
          setMove(mGame.PLAYER_ONE, location); 
         else 
          setMove(mGame.PLAYER_TWO, location); 

         int winner = mGame.checkForWinner(); 

         if (winner == 0) 
         { 
          if (mIsPlayerOneTurn) 
          { 
           mInfoTextView.setText(R.string.turn_player_two); 
           mIsPlayerOneTurn = false; 
          } 
          else 
          { 
           mInfoTextView.setText(R.string.turn_player_one); 
           mIsPlayerOneTurn = true; 
          } 
         } 
         else if (winner == 1) 
         { 
          mInfoTextView.setText(R.string.result_tie); 
          mTieCounter++; 
          mTieCount.setText(Integer.toString(mTieCounter)); 
          mGameOver = true; 
         } 
         else if (winner == 2) 
         { 
          mInfoTextView.setText(R.string.result_player_one_wins); 
          mPlayerOneCounter++; 
          mPlayerOneCount.setText(Integer.toString(mPlayerOneCounter)); 
          mGameOver = true; 
          mIsPlayerOneTurn = false; 
         } 
         else 
         { 
          mInfoTextView.setText(R.string.result_player_two_wins); 
          mPlayerTwoCounter++; 
          mPlayerTwoCount.setText(Integer.toString(mPlayerTwoCounter)); 
          mGameOver = true; 
          mIsPlayerOneTurn = true; 
         } 
        } 
       } 
      } 
     } 
    } 

    // set move for the current player 
    private void setMove(char player, int location) 
    { 
     mGame.setMove(player, location); 
     mBoardButtons[location].setEnabled(false); 
     if (player == mGame.PLAYER_ONE) 
      mBoardButtons[location].setBackgroundDrawable(getResources().getDrawable(R.drawable.ic_x)); 
     else 
      mBoardButtons[location].setBackgroundDrawable(getResources().getDrawable(R.drawable.ic_o)); 
    } 

} 

とTicTacToeGame.classは次のとおりです:

Exception: Unable to instantiate activity ComponentInfo{com.tictactoe.ajaykulkarni.tictactoe/com.tictactoe.ajaykulkarni.tictactoe.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Bundle android.content.Intent.getExtras()' on a null object reference 

MainActivityがある

package com.tictactoe.ajaykulkarni.tictactoe; 

/** 
* Created by Ajay Kulkarni-enEXL on 02/16/2017. 
*/ 

import java.util.Random; 

public class TicTacToeGame { 

    private char mBoard[]; 
    private final static int BOARD_SIZE = 9; 

    public static final char PLAYER_ONE = 'X'; 
    public static final char PLAYER_TWO = '0'; 
    public static final char EMPTY_SPACE = ' '; 

    private Random mRand; 


    public static int getBOARD_SIZE() { 
     // Return the size of the board 
     return BOARD_SIZE; 
    } 

    public TicTacToeGame(){ 

     mBoard = new char[BOARD_SIZE]; 

     for (int i = 0; i < BOARD_SIZE; i++) 
      mBoard[i] = EMPTY_SPACE; 

     mRand = new Random(); 
    } 

    // Clear the board of all X's and O's 
    public void clearBoard() 
    { 
     for (int i = 0; i < BOARD_SIZE; i++) 
     { 
      mBoard[i] = EMPTY_SPACE; 
     } 
    } 

    // set the given player at the given location on the game board. 
    // the location must be available, or the board will not be changed. 
    public void setMove(char player, int location) 
    { 
     mBoard[location] = player; 
    } 

    // Return the best move for the computer to make. You must call setMove() 
    // to actually make the computer move to that location. 
    public int getComputerMove() 
    { 
     int move; 

     // First see if there's a move O can make to win 
     for (int i = 0; i < getBOARD_SIZE(); i++) 
     { 
      if (mBoard[i] != PLAYER_ONE && mBoard[i] != PLAYER_TWO) 
      { 
       char curr = mBoard[i]; 
       mBoard[i] = PLAYER_TWO; 
       if (checkForWinner() == 3) 
       { 
        setMove(PLAYER_TWO, i); 
        return i; 
       } 
       else 
        mBoard[i] = curr; 
      } 
     } 

     // See if there's a move O can make to block X from winning 
     for (int i = 0; i < getBOARD_SIZE(); i++) 
     { 
      if (mBoard[i] != PLAYER_ONE && mBoard[i] != PLAYER_TWO) 
      { 
       char curr = mBoard[i]; 
       mBoard[i] = PLAYER_ONE; 
       if (checkForWinner() == 2) 
       { 
        setMove(PLAYER_TWO, i); 
        return i; 
       } 
       else 
        mBoard[i] = curr; 
      } 
     } 

     // Generate random move 
     do 
     { 
      move = mRand.nextInt(getBOARD_SIZE()); 
     } while (mBoard[move] == PLAYER_ONE || mBoard[move] == PLAYER_TWO); 

     setMove(PLAYER_TWO, move); 
     return move; 
    } 

    // Check for a winner and return a status value indicating who has won. 
    // Return 0 if no winner or tie yet, 1 if it's a tie, 2 if X won, or 3 
    // if O won. 
    public int checkForWinner() 
    { 
     // Check horizontal wins 
     for (int i = 0; i <= 6; i += 3) 
     { 
      if (mBoard[i] == PLAYER_ONE && 
        mBoard[i+1] == PLAYER_ONE && 
        mBoard[i+2] == PLAYER_ONE) 
       return 2; 
      if (mBoard[i] == PLAYER_TWO && 
        mBoard[i+1] == PLAYER_TWO && 
        mBoard[i+2] == PLAYER_TWO) 
       return 3; 
     } 

     // Check vertical wins 
     for (int i = 0; i <= 2; i++) 
     { 
      if (mBoard[i] == PLAYER_ONE && 
        mBoard[i+3] == PLAYER_ONE && 
        mBoard[i+6] == PLAYER_ONE) 
       return 2; 
      if (mBoard[i] == PLAYER_TWO && 
        mBoard[i+3] == PLAYER_TWO && 
        mBoard[i+6] == PLAYER_TWO) 
       return 3; 
     } 

     // Check for diagonal wins 
     if ((mBoard[0] == PLAYER_ONE && 
       mBoard[4] == PLAYER_ONE && 
       mBoard[8] == PLAYER_ONE) || 
       mBoard[2] == PLAYER_ONE && 
         mBoard[4] == PLAYER_ONE && 
         mBoard[6] == PLAYER_ONE) 
      return 2; 
     if ((mBoard[0] == PLAYER_TWO && 
       mBoard[4] == PLAYER_TWO && 
       mBoard[8] == PLAYER_TWO) || 
       mBoard[2] == PLAYER_TWO && 
         mBoard[4] == PLAYER_TWO && 
         mBoard[6] == PLAYER_TWO) 
      return 3; 

     // Check for a tie 
     for (int i = 0; i < getBOARD_SIZE(); i++) 
     { 
      // if we find a number, then no one has won yet 
      if (mBoard[i] != PLAYER_ONE && mBoard[i] != PLAYER_TWO) 
       return 0; 
     } 

     // If we make it through the previous loop, all places are taken, so it's a tie 
     return 1; 
    } 
} 

どうすればそのエラーを修正できますか?

答えて

3

アクティビティのフィールドからエクストラを取得しようとしています。つまり、アクティビティが作成される前にエクストラを取得しようとしています。 からメソッドを作成すると、その値はnull値にはなりません。

例:

boolean mGameType; 
... 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mGameType = getIntent().getExtras().getBoolean("gameType"); 
    ... 
} 

EDIT:あなたは別のActivityから余分を送信したい場合、あなたはそれをこのように起動する必要があります。

startActivity(new Intent(SenderActivity.this, MainActivity.class) 
      .putExtra("gameType", true)); 
+0

私はそのラインを追加し、それが動作しませんでした。私は同じエラーがある...あなたは私を助けてくれますか? –

+0

@AjayKulkarni送信者アクティビティから** gameType **をどのように送信しますか? –

+0

うーん...私は何も考えていません –

関連する問題

 関連する問題