tags:

views:

68

answers:

1

Hey there,

I am new at android development and java programming, but I have decided to program a drinking game app in android. This app basically simulates a deck a cards, a player clicks a button to draw a card then based on the card thats drawn the player plays a drinking game (ie takes 1 drink, takes 2 drinks...ect).

I have the main program in one java file, and the code that shuffles the card deck and puts the card sequence in an array in other java file. My problem is that whenever a class from the other java file (classicMode.java) is called from the main program (fubar.java), my android program crashes and gives the error :

"The application Drinking Game - FUBAR (process com.games.dg) has stopped unexpectedly. Please try again".

Heres the code for the main program:

package com.games.dg;

import java.util.Arrays;
import java.util.Collections;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
import android.view.View;
import android.view.View.OnClickListener;
import com.games.dg.classicMode;

public class fubar extends Activity 
{
    private Button classic;
    private Button custom;
    private Button help;
    private Button back;
    private Button showCard;
    private TextView txtbox;
    private int showCardClick = 0;
    private classicMode newGame;
    String[] cardDeck;



    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        initControls();
    }

    public void initControls()
    {
     classic = (Button)findViewById(R.id.classicGame);
     custom = (Button)findViewById(R.id.customGame);
     help = (Button)findViewById(R.id.gameHelp);



     // Classic Game is Selected
     classic.setOnClickListener(new OnClickListener()
     {
      public void onClick (View v)
      {
       setContentView(R.layout.gamegui);
    cardDeck = newGame.getCards();

       // Back Button Clicked
       back = (Button)findViewById(R.id.backButton);
       back.setOnClickListener(new OnClickListener()
       {
        public void onClick (View v)
        {
         setContentView(R.layout.main);
         initControls();
         showCardClick = 0;
        }
       });

       //start the game method here
       showCard = (Button)findViewById(R.id.showCard);
       txtbox = (TextView)findViewById(R.id.textBox);
       showCard.setOnClickListener(new OnClickListener()
       {
        public void onClick (View v)
        {
         if (showCardClick <=51)
         {
          txtbox.setText(cardDeck[showCardClick]);
             showCardClick++;
         }
         else
          txtbox.setText("End of Game");

        }
       });
            }
}

and heres the code from my other class that shuffles the deck:

package com.games.dg;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

class classicMode
{

 // Variables that describe number of cards and array cards will be placed in

 public int cardCount = 52;
 public static int[][] cards;



 // Variables that describe the rules when a certain card is drawn
 public String ace = "Take 1 Drink!";
 public String two = "Take 2 Drinks!!";
 public String three = "Take 3 Drinks!!!";
 public String four = "Questions: The Dealer must ask the group a question, everyone else must answer his question with a question of their own...";
 public String five = "Take 5 Drinks!!!!!";
 public String six = "I Never....: The person who draws this card must tell the group something he or she has never done, anyone in the group who did what the dealer has'nt takes a drink";
 public String seven = "Thumbmaster: The person who draws this card is the Thumbmaster for the entire game. Everytime he or she puts his thumb on the table, everyone else must follow. The last person to do so takes  a drink.";
 public String eight = "The Categories!: The Dealer must give a category to the group, the group must then mention brands within that category. (Ex. Dealer says: Cars, brands would be honda, toyota, mazda...)";
 public String nine = "Its Rhyme Time: The Dealer says a word, everyone else in the group must come up with a rhyme for that word, the loser takes a drink";
 public String ten = "Everyone Drinks!";
 public String jack = "Dude's Night Out: All the guys take a drink";
 public String queen = "Ladies Drink for Free: All the girls take a drink";
 public String king = "The Waterfall: The Dealer starts drinking, then another person, then a 3rd person and so on. The second person can not stop drinking until the first person stops, the third person cant stop until the second one stops, and so on. Pray that a heavy drinker doesnt go first!";


 // Shuffles the 2D card matrix, in the matrix each number represents a card

public static void mixup()
 {
  int[] values = {1,2,3,4,5,6,7,8,9,10,11,12,13};
  for(int i=0;i<=3;i++)
  {
   Collections.shuffle(Arrays.asList(values));
   for(int j=0;j<=12;j++)
    cards[j][i]=values[j];
  }

 }

 //Outputs the card order as a 1D array of strings

public String[] getCards()
 {
  String[] card_deck = new String[52];
  int k = 0;
  mixup();

  for(int i=0;i<=12;i++)
  {
   for(int j=0;j<=3;j++)
   {
    if(j==0)
    {
     card_deck[k] = Integer.toString(cards[i][j]) + "of Hearts";
     k++;
    }
    if (j==1)
    {
     card_deck[k] = Integer.toString(cards[i][j]) + "of Spades";
     k++;
    }
    if (j==2)
    {
     card_deck[k] = Integer.toString(cards[i][j]) + "of Clubs";
     k++;
    }
    if (j==3)
    {
     card_deck[k] = Integer.toString(cards[i][j]) + "of Diamonds";
     k++;
    }

   }
  }

  return card_deck;
 }




}

So for instance when the call "cardDeck = newGame.getCards();" or "txtbox.setText(cardDeck[showCardClick]);" is made, the program crashes/ Can anyone help me out?

Thanks in advance!

update, heres my log of what occured when the program started:

D/HomeLoaders(   93):   ----> cleared application list
I/ActivityManager(   50): Displayed activity com.games.dg/.fubar: 1360 ms (total 1360 ms)
D/KeyguardViewMediator(   50): pokeWakelock(5000)
I/ARMAssembler(   50): generated scanline__00000077:03545404_00000A04_00000000 [ 29 ipp] (51 ins) at [0x2d1320:0x2d13ec] in 4688047 ns
I/ActivityManager(   50): Start proc com.android.inputmethod.latin for service com.android.inputmethod.latin/.LatinIME: pid=235 uid=10001 gids={3003, 1015}
D/ddm-heap(  235): Got feature list request
D/dalvikvm(  235): Trying to load lib /system/lib/libjni_latinime.so 0x43758040
D/dalvikvm(  235): Added shared lib /system/lib/libjni_latinime.so 0x43758040
D/AndroidRuntime(  221): Shutting down VM
W/dalvikvm(  221): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
E/AndroidRuntime(  221): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime(  221): java.lang.NullPointerException
E/AndroidRuntime(  221):    at com.games.dg.classicMode.mixup(classicMode.java:42)
E/AndroidRuntime(  221):    at com.games.dg.classicMode.getCards(classicMode.java:52)
E/AndroidRuntime(  221):    at com.games.dg.fubar$1.onClick(fubar.java:49)
E/AndroidRuntime(  221):    at android.view.View.performClick(View.java:2344)
E/AndroidRuntime(  221):    at android.view.View.onTouchEvent(View.java:4133)
E/AndroidRuntime(  221):    at android.widget.TextView.onTouchEvent(TextView.java:6510)
E/AndroidRuntime(  221):    at android.view.View.dispatchTouchEvent(View.java:3672)
E/AndroidRuntime(  221):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
E/AndroidRuntime(  221):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
E/AndroidRuntime(  221):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
E/AndroidRuntime(  221):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
E/AndroidRuntime(  221):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1712)
E/AndroidRuntime(  221):    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1202)
E/AndroidRuntime(  221):    at android.app.Activity.dispatchTouchEvent(Activity.java:1987)
E/AndroidRuntime(  221):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1696)
E/AndroidRuntime(  221):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1658)
E/AndroidRuntime(  221):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  221):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(  221):    at android.app.ActivityThread.main(ActivityThread.java:4203)
E/AndroidRuntime(  221):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(  221):    at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(  221):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime(  221):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
E/AndroidRuntime(  221):    at dalvik.system.NativeStart.main(Native Method)
I/Process (   50): Sending signal. PID: 221 SIG: 3
I/dalvikvm(  221): threadid=7: reacting to signal 3
E/dalvikvm(  221): Unable to open stack trace file '/data/anr/traces.txt': Permission denied
I/ARMAssembler(   50): generated scanline__00000077:03515104_00000000_00000000 [ 27 ipp] (41 ins) at [0x34aa18:0x34aabc] in 572941 ns
I/ARMAssembler(   50): generated scanline__00000077:03515104_00001001_00000000 [ 64 ipp] (84 ins) at [0x34aac0:0x34ac10] in 1098617 ns
I/Process (  221): Sending signal. PID: 221 SIG: 9
I/ActivityManager(   50): Process com.games.dg (pid 221) has died.
I/WindowManager(   50): WIN DEATH: Window{43949420 com.games.dg/com.games.dg.fubar paused=false}
W/UsageStats(   50): Unexpected resume of com.android.launcher while already resumed in com.games.dg
W/InputManagerService(   50): Got RemoteException sending setActive(false) notification to pid 221 uid 10022
+1  A: 

You never actually initialized those references. This is a bit different than C++ where Button button would actually create an instance of the type Button'. In Java, Button button just creates a reference to it, so you'll need to say

newGame = new classicMode();

In your onCreate() (or you can even initialize it like that). Btw, it is Java convention to always have class names start in upper case.

UPDATE: Now that you posted the logcat, the problem lies with the cards array. It's an array of an array, so you need to initialize the outer array, and then the inner array, i.e.

cards = new int[52][];

for (int x=0; x<52; x++) {
    cards[x] = new int[52];
}

or

cards = new int[52][52];

I haven't really looked at your code closely, but I should mention that this approach seems very inefficient, just like creating a string for each card type. You should create the string at run-time instead.

EboMike
hi EboMike, thanks for the response. I've tried putting newGame = new classicMode(); into the onCreate() method but i wasnt able to access it from my other classes, so i replaced "private classicMode newGame;" from above with "classicMode newGame = new classicMode();" but i still get the same error.
Browng
Whenever you get crashes, you need to send us the logcat output. Also, did you initialize all other variables that need to be initialized? But really, we need the logcat output, and you need to tell us what's on the line that's mentioned in the logcat.
EboMike
Hi EboMike, sorry about that, I have uploaded the log of what happened when I started the program. As for the variables I have'nt initialised them like that as of yet. I will try it out.
Browng
What's on line 42 in classicMode.java?
EboMike
Ah, it's the cards. That's an array of an array, so you need to initialize the outer array, and then each one of the inner arrays.
EboMike
How would I go about doing that?
Browng
I edited my answer to explain that.
EboMike
Hi, Mike. thanks alot man the code works now. I will try and create a new efficient code in the future, I just wanted to make sure this worked. Thanks again!!
Browng
Sure thing... I understand you're just easing your way into Java. Enjoy the ride! And good luck with your app!
EboMike