1
\$\begingroup\$

Good morning again. This is David. Please, I need an urgent help regarding control model view where I making a code that uniquely separating into groups:

  1. An Activity Java Class to Display the Interface
  2. A View and Function Java Class for Drawing Cards and Display it on the Activity Class

The problem is that the result returns a Null Pointer Exception. I have initialize for the ID for Text View and Image View. Under this class "draw_deck.java". Please help me.

Here's my code for draw_deck.java:

package com.bodapps.inbetween.model;

import android.content.Context;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.bodapps.inbetween.R;

public class draw_deck extends View
{

public TextView count_label;
public ImageView draw_card;
private int count;










public draw_deck(Context context) 
{
    super(context);
    // TODO Auto-generated constructor stub

            //I have initialized two widgets for ID. I still don't get it why I got forced closed by Null Pointer Exception thing.
    draw_card = (ImageView) findViewById(R.id.IV_Draw_Card);
    count_label = (TextView) findViewById(R.id.Text_View_Count_Card);
}












public void draw(int s, int c, String strSuit, String strValue, Pile pile, Context context)
{
    //super(context);

    //Just printing the card drawn from pile
    int suit, value = 1;
    draw_card = (ImageView) findViewById(R.id.IV_Draw_Card);
    count_label = (TextView) findViewById(R.id.Text_View_Count_Card);
    Card card;

    if(!pile.isEmpty()) //Setting it to IF statement displays the card one by one.
    {
        card = pile.drawFromPile();

        //Need to check first if card is null.
        if (card != null)
        {
            //draws an extra
            if (card != null)
            {  
                //Get suit of card to print out.
                suit = card.getSuit();
                switch (suit)
                {
                case CardInfo.DIAMOND:
                    strSuit = "DIAMOND";
                    s=0;
                    break;
                case CardInfo.HEART:
                    strSuit = "HEART";
                    s=1;
                    break;
                case CardInfo.SPADE:
                    strSuit = "SPADE";
                    s=2;
                    break;
                case CardInfo.CLUB:
                    strSuit = "CLUB";
                    s=3;
                    break;
                }

                //Get value of card to print out.
                value = card.getValue();
                switch (value)
                {
                case CardInfo.ACE:
                    strValue = "ACE";
                    c=0;
                    break;
                case CardInfo.TWO:
                    c=1;
                    break;
                case CardInfo.THREE:
                    strValue = "THREE";
                    c=2;
                    break;
                case CardInfo.FOUR:
                    strValue = "FOUR";
                    c=3;
                    break;
                case CardInfo.FIVE:
                    strValue = "FIVE";
                    c=4;
                    break;
                case CardInfo.SIX:
                    strValue = "SIX";
                    c=4;
                    break;
                case CardInfo.SEVEN:
                    strValue = "SEVEN";
                    c=4;
                    break;
                case CardInfo.EIGHT:
                    strValue = "EIGHT";
                    c=4;
                    break;
                case CardInfo.NINE:
                    strValue = "NINE";
                    c=4;
                    break;
                case CardInfo.TEN:
                    strValue = "TEN";
                    c=4;
                    break;
                case CardInfo.JACK:
                    strValue = "JACK";
                    c=4;
                    break;
                case CardInfo.QUEEN:
                    strValue = "QUEEN";
                    c=4;
                    break;
                case CardInfo.KING:
                    strValue = "KING";
                    c=4;
                    break;
                }

            }
        }
    }//

            //Below two lines of code, this is where issued the Null Pointer Exception.
    draw_card.setImageResource(deck[s][c]);
    count_label.setText(new StringBuilder(strValue).append(" of ").append(strSuit).append(String.valueOf(" " + count++)).toString());

}










//Choice of Suits in a Deck
    public Integer[][] deck = 
    {

        //Array Group 1 is [0][0] (No. of Cards: 4 - DIAMOND)
        {
            R.drawable.card_dummy_1,
            R.drawable.card_dummy_2,
            R.drawable.card_dummy_4,
            R.drawable.card_dummy_5,
            R.drawable.card_dummy_3
        },

        //Array Group 2 is [1][0] (No. of Cards: 4 - HEART)
        {
            R.drawable.card_dummy_1,
            R.drawable.card_dummy_2,
            R.drawable.card_dummy_4,
            R.drawable.card_dummy_5,
            R.drawable.card_dummy_3
        },

        //Array Group 3 is [2][0] (No. of Cards: 4 - SPADE)
        {
            R.drawable.card_dummy_1,
            R.drawable.card_dummy_2,
            R.drawable.card_dummy_4,
            R.drawable.card_dummy_5,
            R.drawable.card_dummy_3
        },

        //Array Group 4 is [3][0] (No. of Cards: 4 - CLUB)
        {
            R.drawable.card_dummy_1,
            R.drawable.card_dummy_2,
            R.drawable.card_dummy_4,
            R.drawable.card_dummy_5,
            R.drawable.card_dummy_3
        },

    };

}

And this one of the activity class, Player_Mode_2.java:

package com.bodapps.inbetween;

import java.util.Random;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bodapps.inbetween.model.Card;
import com.bodapps.inbetween.model.Pile;
import com.bodapps.inbetween.model.draw_deck;

/*
 * 
 *      Public class for Two-Player mode.
 * 
 */

public class Player_Mode_2 extends Activity
{

//Image Views
private ImageView draw_card;
private ImageView player_1;
private ImageView player_2;
private ImageView icon;

//Buttons
private Button set_deck;

//Edit Texts
private EditText enter_no_of_decks;

//text Views
private TextView count_label;

//Integer Data Types
private int no_of_cards, count;
private int card_multiplier;

//Contexts
final Context context = this;

//Pile Model
public Pile pile;

//Card Model
public Card card;










//create View
@Override
public void onCreate(Bundle savedInstanceState)
{

    super.onCreate(savedInstanceState);
    setContentView(R.layout.play_2_player_mode);





    //-----[ Search for Views ]-----

    //Initialize for Image View
    draw_card = (ImageView) findViewById(R.id.IV_Draw_Card);
    player_1 = (ImageView) findViewById(R.id.IV_Player_1_Card);
    player_2 = (ImageView) findViewById(R.id.IV_Player_2_Card);

    //Initialize for Text view or Label
    count_label = (TextView) findViewById(R.id.Text_View_Count_Card);






    //-----[ Adding Values ]-----
    //Integer Values
    count = 0;
    no_of_cards = 0;





    //-----[ Adding Dialog ]-----
    //Initializing Dialog
    final Dialog deck_dialog = new Dialog(context);
    deck_dialog.setContentView(R.layout.dialog);
    deck_dialog.setTitle("Deck Dialog");





    //-----[ Initializing Views for Dialog's Contents ]-----

    //Initialize for Edit Text
    enter_no_of_decks = (EditText) deck_dialog.findViewById(R.id.Edit_Text_Set_Number_of_Decks);

    //Initialize for Button
    set_deck = (Button) deck_dialog.findViewById(R.id.Button_Deck);





    //-----[ Setting onClickListener() ]-----

    //Set Event Listener for Image view
    draw_card.setOnClickListener(new Draw_Card_Model());

    //Set Event Listener for Setting the Deck
    set_deck.setOnClickListener(new OnClickListener() 
    {

        public void onClick(View v) 
        {

            if(card_multiplier <= 8)
            {
                //Use "Integer.parseInt()" method to instantly convert from String to int value.
                card_multiplier = Integer.parseInt(enter_no_of_decks.getText().toString()); 

                //Shuffling cards...
                pile = new Pile(card_multiplier); //Multiply no. of decks

                //Dismiss or close the dialog.
                deck_dialog.dismiss();
            }
            else
            {
                Toast.makeText(getApplicationContext(), "Please choose a number from 1 to 8.", Toast.LENGTH_SHORT).show();
            }

        }

    });

    //Show dialog.
    deck_dialog.show();

}










//Shuffling the Array
public void Shuffle_Cards(Integer[][] Shuffle_Deck)
{

    Random random = new Random();

    for(int i = Shuffle_Deck[no_of_cards].length - 1; i >=0; i--)
    {
        int Index = random.nextInt(i + 1);


        //Simple Swapping
        Integer swap = Shuffle_Deck[card_multiplier-1][Index];
        Shuffle_Deck[card_multiplier-1][Index] = Shuffle_Deck[card_multiplier-1][i];
        Shuffle_Deck[card_multiplier-1][i] = swap;
    }

}










//Private Class for Random Card Draw
private class Draw_Card_Model implements OnClickListener
{

    public void onClick(View v)
    { 

        //Just printing the card drawn from pile
        int suit = 0, value = 0;
        String strSuit = "", strValue = "";

        draw_deck draw = new draw_deck(context); //This line is where issued the Null Pointer Exception.


        if (count == card_multiplier*52)
        {
            // A message shows up when all cards are draw out.
            Toast.makeText(getApplicationContext(), "All cards have been used up.", Toast.LENGTH_SHORT).show();
            draw_card.setEnabled(false);
        }
        else
        {
            draw.draw(suit, value, strSuit, strValue, pile, context);

            count_label.setText(count); //This is where I got force closed error, although "int count" have initialized the number. This was supposed to accept in the setText() method.
            count++;
        }

    }

}

}

Take note that the issues on Null Pointer Exception is the Image View and the Edit Text. I got to test it. Thanks. If you have any info about my question, let me know it frankly.

\$\endgroup\$
4
  • \$\begingroup\$ I'm not familiar with Android, but providing the stack trace associated with the null exception will be much more useful than the massive code dump for potential answerers. The community also responds better to toy examples. Try to localize your problem--replicate it with the smallest amount of code possible. \$\endgroup\$ Commented Aug 28, 2012 at 6:11
  • \$\begingroup\$ Which EditText and which ImageView ? \$\endgroup\$
    – Phill.Zitt
    Commented Aug 28, 2012 at 6:26
  • \$\begingroup\$ @Phill.Zitt TextView count_label and ImageView draw_card are behind the null pointer issue. \$\endgroup\$ Commented Aug 28, 2012 at 7:53
  • \$\begingroup\$ I would check the ids in the layout xml then. It sounds like it can't find the right ones. \$\endgroup\$
    – Phill.Zitt
    Commented Aug 28, 2012 at 16:02

1 Answer 1

1
\$\begingroup\$

Truly mysterious null pointer exceptions often arise from the view viewing model code that is being changed under it's nose by a different process. You shouldn't be changing the data structures in "onclick" methods unless everything is carefully synchronized against view access.

\$\endgroup\$
3
  • 1
    \$\begingroup\$ That means is to trace first by initializing very carefully on any object before putting up the functions, right? \$\endgroup\$ Commented Sep 4, 2012 at 3:19
  • \$\begingroup\$ Any time you have one process looking at data that another process is changing, it's very hard to imagine all the ways it can go wrong. The best solution is to just don't do it. The second best solition is to use synchronization primitives to be sure that only one can run at once. \$\endgroup\$
    – ddyer
    Commented Sep 4, 2012 at 4:13
  • 1
    \$\begingroup\$ Thanks for your help, @ddyer. I finally recalled the solution and it has to be initialized under onCreate() while the field names are outside from onCreate(). If you say synchronozation you mean is to organize the steps officially if the contents are known, right? Something like that, right? \$\endgroup\$ Commented Nov 15, 2012 at 11:20

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .