Android program crashes when I call a class from another java file
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
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.
精彩评论