当我从另一个java文件调用一个类时,Android程序崩溃

当我从另一个java文件调用一个类时,Android程序崩溃,android,crash,Android,Crash,我是android开发和java编程的新手,但我已经决定用android编写一个饮酒游戏应用程序。这个应用程序基本上模拟了一副a牌,玩家点击一个按钮画一张牌,然后根据画的牌玩一个饮酒游戏(即喝一杯,喝两杯…等等) 我在一个java文件中有主程序,代码洗牌卡片组并将卡片序列放入另一个java文件的数组中。我的问题是,每当从主程序(fubar.java)调用另一个java文件(classicMode.java)中的类时,我的android程序就会崩溃并给出错误: “应用程序饮酒游戏-FUBAR(pr

我是android开发和java编程的新手,但我已经决定用android编写一个饮酒游戏应用程序。这个应用程序基本上模拟了一副a牌,玩家点击一个按钮画一张牌,然后根据画的牌玩一个饮酒游戏(即喝一杯,喝两杯…等等)

我在一个java文件中有主程序,代码洗牌卡片组并将卡片序列放入另一个java文件的数组中。我的问题是,每当从主程序(fubar.java)调用另一个java文件(classicMode.java)中的类时,我的android程序就会崩溃并给出错误:

“应用程序饮酒游戏-FUBAR(process com.games.dg)意外停止。请重试”

以下是主程序的代码:

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

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




}
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

您从未实际初始化过这些引用。这与C++相比有点不同,其中代码>按钮按钮< /C> >实际上会创建类型<代码>按钮< /C> >的实例。在Java中,
按钮
只是创建了一个对它的引用,所以您需要说

newGame = new classicMode();
在onCreate()中(或者您甚至可以这样初始化它)。 顺便说一句,Java的惯例是总是让类名以大写开头

更新:现在您发布了日志,问题在于卡阵列。它是一个数组中的一个数组,因此需要初始化外部数组,然后初始化内部数组,即

cards = new int[52][];

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

我还没有仔细研究过您的代码,但我应该指出,这种方法似乎效率很低,就像为每种卡类型创建一个字符串一样。您应该在运行时创建字符串。

您从未实际初始化过这些引用。这与C++相比有点不同,其中代码>按钮按钮< /C> >实际上会创建类型<代码>按钮< /C> >的实例。在Java中,
按钮
只是创建了一个对它的引用,所以您需要说

newGame = new classicMode();
在onCreate()中(或者您甚至可以这样初始化它)。 顺便说一句,Java的惯例是总是让类名以大写开头

更新:现在您发布了日志,问题在于卡阵列。它是一个数组中的一个数组,因此需要初始化外部数组,然后初始化内部数组,即

cards = new int[52][];

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

我还没有仔细研究过您的代码,但我应该指出,这种方法似乎效率很低,就像为每种卡类型创建一个字符串一样。您应该在运行时创建字符串。

我怀疑这是打包问题,而不是编码问题。例如,您确定要包含classicMode类吗?您可能应该了解java编程是如何工作的。Laurence,我相信我确实在主类中包含了classicMode类和“import com.games.dg.classicMode”;FWIW:imports在Java中不“包含”任何内容。Java导入只是一个别名。如果你说
import com.foo.Bar
,那意味着“每当我说
Bar
时,我的意思是
com.foo.Bar
”。事实上,如果删除导入并用完全限定的类名替换类引用,编译器将生成完全相同的字节码。我怀疑这是一个打包问题,而不是编码问题。例如,您确定要包含classicMode类吗?您可能应该了解java编程是如何工作的。Laurence,我相信我确实在主类中包含了classicMode类和“import com.games.dg.classicMode”;FWIW:imports在Java中不“包含”任何内容。Java导入只是一个别名。如果你说
import com.foo.Bar
,那意味着“每当我说
Bar
时,我的意思是
com.foo.Bar
”。事实上,如果删除导入并用完全限定的类名替换类引用,编译器将生成完全相同的字节码。我试着把newGame=newclassicmode()放进去;进入onCreate()方法,但我无法从其他类访问它,因此我将上面的“private classicMode newGame;”替换为“classicMode newGame=new classicMode();”,但我仍然得到相同的错误。每当崩溃时,需要向我们发送logcat输出。另外,您是否初始化了所有其他需要初始化的变量?但实际上,我们需要logcat输出,你需要告诉我们logcat中提到的在线内容。嗨,埃博迈克,很抱歉,我已经上传了启动程序时发生的事情的日志。至于变量,到目前为止,我还没有这样初始化它们。我会试试看。classicMode.java的第42行是什么?啊,是卡片。这是一个数组中的一个数组,所以您需要初始化外部数组,然后初始化每个内部数组。嗨,EboMike,感谢您的响应。我试着把newGame=newclassicmode()放进去;进入onCreate()方法,但我无法从其他类访问它,因此我将上面的“private classicMode newGame;”替换为“classicMode newGame=new classicMode();”,但我仍然得到相同的错误。每当崩溃时,需要向我们发送logcat输出。另外,您是否初始化了所有其他需要初始化的变量?但实际上,我们需要logcat输出,你需要告诉我们logcat中提到的在线内容。嗨,埃博迈克,很抱歉,我已经上传了启动程序时发生的事情的日志。至于变量,到目前为止,我还没有这样初始化它们。我会试试看。classicMode.java的第42行是什么?啊,是卡片。这是一个数组的数组,所以需要初始化外部数组,然后初始化每个内部数组。