2017-02-15 64 views
-1

我为tictactoe游戏编写了代码,但是它向我显示了这个错误在运行时:java.lang.NullPointerException:尝试调用虚拟方法'android.os.Bundle android.content.Intent.getExtras()'null对象引用

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; 

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是:

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

您正试图从活动中的某个字段中获得额外资讯,即您正在尝试在创建活动之前获取额外资讯。如果您从onCreate方法中获得额外资源,它将不会为空值。

例子:

boolean mGameType; 
... 

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

编辑:如果你想从一个活动额外发送到另一个,你应该开始这样说:

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

我说那行,它没有工作。我得到了同样的错误...你能帮我吗? –

+0

@AjayKulkarni你如何从发件人Activity发送额外的** gameType **? –

+0

呃......我没有任何想法 –

相关问题