2017-02-15 5 views
-1

aufrufen Ich schrieb einen Code für Tictactoe Spiel, aber es zeigt mir diesen Fehler zur Laufzeit:java.lang.NullPointerException: Versuch, die virtuelle Methode 'android.os.Bundle android.content.Intent.getExtras()' auf einem Nullobjekt Referenz

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 

Mein MainActivity ist:

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

} 

und TicTacToeGame.class ist:

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

Wie kann ich diesen Fehler beheben?

Antwort

3

Sie versuchen, Extras aus einem Feld in der Aktivität zu erhalten, d. H. Sie versuchen, die Extras zu erhalten, bevor die Aktivität erstellt wird. Wenn Sie die Extras von onCreate Methode erhalten, wird es kein Nullwert sein.

Beispiel:

boolean mGameType; 
... 

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

EDIT: Wenn Sie von einer Aktivität zur anderen zusätzlichen senden möchten, sollten Sie es auf diese Weise beginnen:

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

Ich fügte hinzu, dass Linie, es nicht funktioniert . Ich habe denselben Fehler ... Kannst du mir bitte helfen? –

+0

@AjayKulkarni Wie schicke ich den extra ** gameType ** von der Sender Aktivität? –

+0

Ummm ... Ich habe keine Ahnung –

Verwandte Themen