2012-10-15 56 views
2

我已经回顾了很多类似的问题,但无法启动活动,但它们似乎与我的问题完全不符。我正在做一个简单的黑色杰克游戏,但它的强制退出。我怀疑加载了我所拥有的png图像存在问题。在resetGame()函数中,单步执行调试器会崩溃。我确定我正在做一些愚蠢的事情。无法读取流图像?无法启动活动ComponentInfo

新的logcat跟着山姆的建议后:

10-15 21:59:08.448: E/AndroidRuntime(3070): FATAL EXCEPTION: main 
10-15 21:59:08.448: E/AndroidRuntime(3070): android.content.res.Resources$NotFoundException: File res/layout/action_menu_layout.xml from xml type layout resource ID #0x109001b 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at android.content.res.Resources.loadXmlResourceParser(Resources.java:2145) 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at android.content.res.Resources.loadXmlResourceParser(Resources.java:2100) 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at android.content.res.Resources.getLayout(Resources.java:852) 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at android.view.LayoutInflater.inflate(LayoutInflater.java:394) 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at com.android.internal.view.menu.BaseMenuPresenter.getMenuView(BaseMenuPresenter.java:70) 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at com.android.internal.view.menu.ActionMenuPresenter.getMenuView(ActionMenuPresenter.java:148) 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at com.android.internal.widget.ActionBarView.setMenu(ActionBarView.java:427) 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:385) 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at com.android.internal.policy.impl.PhoneWindow.invalidatePanelMenu(PhoneWindow.java:747) 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:2913) 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at android.os.Handler.handleCallback(Handler.java:615) 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at android.os.Handler.dispatchMessage(Handler.java:92) 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at android.os.Looper.loop(Looper.java:137) 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at java.lang.reflect.Method.invoke(Method.java:511) 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at dalvik.system.NativeStart.main(Native Method) 
10-15 21:59:08.448: E/AndroidRuntime(3070): Caused by: java.lang.RuntimeException: Assetmanager has been closed 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at android.content.res.AssetManager.openXmlBlockAsset(AssetManager.java:485) 
10-15 21:59:08.448: E/AndroidRuntime(3070):  at android.content.res.Resources.loadXmlResourceParser(Resources.java:2127) 

10-15 21:59:08.448:E/AndroidRuntime(3070):... 18多个

我的logcat:

10-15 20:21:43.309: E/AndroidRuntime(2863): FATAL EXCEPTION: main 
10-15 20:21:43.309: E/AndroidRuntime(2863): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.smith.blackjack/com.smith.blackjack.Main}: java.lang.NullPointerException 
10-15 20:21:43.309: E/AndroidRuntime(2863):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
10-15 20:21:43.309: E/AndroidRuntime(2863):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
10-15 20:21:43.309: E/AndroidRuntime(2863):  at android.app.ActivityThread.access$600(ActivityThread.java:130) 
10-15 20:21:43.309: E/AndroidRuntime(2863):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
10-15 20:21:43.309: E/AndroidRuntime(2863):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-15 20:21:43.309: E/AndroidRuntime(2863):  at android.os.Looper.loop(Looper.java:137) 
10-15 20:21:43.309: E/AndroidRuntime(2863):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
10-15 20:21:43.309: E/AndroidRuntime(2863):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-15 20:21:43.309: E/AndroidRuntime(2863):  at java.lang.reflect.Method.invoke(Method.java:511) 
10-15 20:21:43.309: E/AndroidRuntime(2863):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
10-15 20:21:43.309: E/AndroidRuntime(2863):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-15 20:21:43.309: E/AndroidRuntime(2863):  at dalvik.system.NativeStart.main(Native Method) 
10-15 20:21:43.309: E/AndroidRuntime(2863): Caused by: java.lang.NullPointerException 
10-15 20:21:43.309: E/AndroidRuntime(2863):  at com.smith.blackjack.DeckOfCards.<init>(DeckOfCards.java:17) 
10-15 20:21:43.309: E/AndroidRuntime(2863):  at com.smith.blackjack.Main.resetGame(Main.java:98) 
10-15 20:21:43.309: E/AndroidRuntime(2863):  at com.smith.blackjack.Main.onCreate(Main.java:67) 
10-15 20:21:43.309: E/AndroidRuntime(2863):  at android.app.Activity.performCreate(Activity.java:5008) 
10-15 20:21:43.309: E/AndroidRuntime(2863):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
10-15 20:21:43.309: E/AndroidRuntime(2863):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
10-15 20:21:43.309: E/AndroidRuntime(2863):  ... 11 more 

我androidmanifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.smith.blackjack" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="11" 
    android:targetSdkVersion="15" /> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".Main" 
     android:label="@string/title_activity_main" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

这里是我的Main.java

package com.smith.blackjack; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.res.AssetManager; 
import android.graphics.drawable.Drawable; 

import java.io.IOException; 
import java.io.InputStream; 

import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ImageView; 

public class Main extends Activity { 

private ImageView dealerCard0; 
private ImageView dealerCard1; 
private ImageView dealerCard2; 
private ImageView dealerCard3; 
private ImageView playerCard0; 
private ImageView playerCard1; 
private ImageView playerCard2; 
private ImageView playerCard3; 
private ImageView imgResult; 
private Button btnDeal; 
private Button btnDraw; 
private Button btnHold; 
private DeckOfCards deckOfCards; 
private int[] dealerValues; 
private int dealerSum; 
private int dealerCardNumber; 
private int[] playerValues; 
private int playerSum; 
private int playerCardNumber; 
private InputStream dealerHiddenCard; 
private Card dealerCard; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    dealerCard0 = (ImageView) findViewById(R.id.dealerCard0); 
    dealerCard1 = (ImageView) findViewById(R.id.dealerCard1); 
    dealerCard2 = (ImageView) findViewById(R.id.dealerCard2); 
    dealerCard3 = (ImageView) findViewById(R.id.dealerCard3); 

    playerCard0 = (ImageView) findViewById(R.id.playerCard0); 
    playerCard1 = (ImageView) findViewById(R.id.playerCard1); 
    playerCard2 = (ImageView) findViewById(R.id.playerCard2); 
    playerCard3 = (ImageView) findViewById(R.id.playerCard3); 

    imgResult = (ImageView) findViewById(R.id.imgResult); 

    btnDeal = (Button) findViewById(R.id.deal); 
    btnDraw = (Button) findViewById(R.id.draw); 
    btnHold = (Button) findViewById(R.id.hold); 

    btnDeal.setOnClickListener(btnDealListener); 
    btnDraw.setOnClickListener(btnDrawListener); 
    btnHold.setOnClickListener(btnHoldListener); 


    resetGame(); 

} 

private void resetGame(){ 

    AssetManager assets = getAssets(); 
    dealerValues = new int[4]; 
    playerValues = new int[4]; 
    dealerSum = 0; 
    playerSum = 0; 
    dealerCardNumber = 0; 
    playerCardNumber = 0; 
    for (int i = 0; i < 4; i++) { 
     dealerValues[i] = 0; 
     playerValues[i] = 0; 
    } 

    try { 
     InputStream stream = assets.open("cardback.png"); 
     // stream = assets.open("cardback.png"); 
     Drawable cardImage = Drawable.createFromStream(stream, null); 
     dealerCard0.setImageDrawable(cardImage); 
     dealerCard1.setImageDrawable(cardImage); 
     dealerCard2.setImageDrawable(cardImage); 
     dealerCard3.setImageDrawable(cardImage); 
     playerCard0.setImageDrawable(cardImage); 
     playerCard1.setImageDrawable(cardImage); 
     playerCard2.setImageDrawable(cardImage); 
     playerCard3.setImageDrawable(cardImage); 
     imgResult.setImageDrawable(cardImage); 
     deckOfCards = new DeckOfCards(); 
     deckOfCards.shuffle(); 
     assets.close(); 
    } 
    catch (IOException e){ 
     Log.e("Reset Game", "Error Loading", e); 
    } 
} 

public OnClickListener btnDealListener = new OnClickListener() 
{ 
//  @Override 
    public void onClick(View v) { 


     try { 
      AssetManager assets = getAssets(); 
      InputStream stream; 

      // first player card 
      Card newCard; 
      newCard = deckOfCards.dealCard(); 
      playerValues[playerCardNumber] = newCard.faceValue; 
      playerCardNumber++;    
      stream = assets.open(newCard.File); 
      Drawable cardImage = Drawable.createFromStream(stream, newCard.File); 
      playerCard0.setImageDrawable(cardImage); 
      assets.close(); 

      // second player card 
      newCard = deckOfCards.dealCard(); 
      playerValues[playerCardNumber] = newCard.faceValue; 
      playerCardNumber++; 
      stream = assets.open(newCard.File); 
      cardImage = Drawable.createFromStream(stream, newCard.File); 
      playerCard1.setImageDrawable(cardImage); 
      assets.close(); 

      // first dealer card hidden 
      newCard = deckOfCards.dealCard(); 
      dealerCard = newCard; 
      dealerValues[dealerCardNumber] = newCard.faceValue; 
      dealerCardNumber++; 
      dealerHiddenCard = assets.open(newCard.File); 
      stream = assets.open("cardback.png"); 
      cardImage = Drawable.createFromStream(stream, "cardback"); 
      dealerCard0.setImageDrawable(cardImage); 
      assets.close(); 

      // second dealer card open 
      newCard = deckOfCards.dealCard(); 
      dealerValues[dealerCardNumber] = newCard.faceValue; 
      dealerCardNumber++; 
      stream = assets.open(newCard.File); 
      cardImage = Drawable.createFromStream(stream, newCard.File); 
      dealerCard1.setImageDrawable(cardImage); 
      assets.close(); 
     } 
     catch (IOException e){ 
      Log.e("Deal", "Error Loading", e); 
     } 

    }; 
}; 

public OnClickListener btnDrawListener = new OnClickListener() 
{ 
//  @Override 
    public void onClick(View v) { 
     try { 
      AssetManager assets = getAssets(); 
      InputStream stream; 

      // get next player card 
      Card newCard; 
      newCard = deckOfCards.dealCard(); 
      playerValues[playerCardNumber] = newCard.faceValue; 
      playerCardNumber++;    
      stream = assets.open(newCard.File); 
      Drawable cardImage = Drawable.createFromStream(stream, newCard.File); 
      switch (playerCardNumber){ 
      case 3: 
       playerCard2.setImageDrawable(cardImage); 
      case 4: 
       playerCard3.setImageDrawable(cardImage); 
      } 
      assets.close(); 
     } 
     catch (IOException e){ 
      Log.e("Draw", "Error Loading", e); 
     } 
    }; 
}; 


public OnClickListener btnHoldListener = new OnClickListener() 
{ 
//  @Override 
    public void onClick(View v) { 
     Drawable cardImage; 
     // evaluate player hand 
     playerSum = evaluate(playerValues); 
     if (playerSum > 21){ 
      // player losses 
     } 
     // flip over the dealer hidden card 
     cardImage = Drawable.createFromStream(dealerHiddenCard, dealerCard.File); 
     Card newCard; 
     InputStream stream; 
     AssetManager assets = getAssets(); 
     for (int i=2; i<4; i++){ 
      dealerSum = evaluate(dealerValues); 
      if (dealerSum < 16) { 
       newCard = deckOfCards.dealCard(); 
       dealerValues[dealerCardNumber] = newCard.faceValue; 
       dealerCardNumber++; 
       try { 
        stream = assets.open(newCard.File); 
        cardImage = Drawable.createFromStream(stream, newCard.File); 
        switch (dealerCardNumber){ 
        case 3: 
         dealerCard2.setImageDrawable(cardImage); 
        case 4: 
         dealerCard3.setImageDrawable(cardImage); 
        } 
        assets.close(); 
       } 
       catch (IOException e){ 
        Log.e("Draw", "Error Loading", e); 
       } 
       if (dealerSum < playerSum) { 
        // player wins 
       } 
       if (dealerSum > playerSum){ 
        // dealer wins 
       } 
       if (dealerSum == playerSum){ 
        // it is a draw 
       } 
      } 

     } 


    }; 
}; 

public int evaluate (int[]values) { 
    int sumCards = 0; 
    for (int i = 0; i < 4; i++){ 
     sumCards += values[i]; 
    } 
    if (sumCards > 21) { 
     for (int i = 0; i < 4; i++){ 
      if (values[i] == 11) { 
       values[i] = 1; 
       sumCards -= 10; 
       continue; 
      } 
     } 
    } 
    return sumCards; 
} 

} 

我DeckOfCards类:

package com.smith.blackjack; 

import java.util.Random; 

public class DeckOfCards { 

private Card [] deck; 
private int currentCard; 
private static final int NUMBER_OF_CARDS = 52; 
private static final Random randomNumbers = new Random(); 

public DeckOfCards() { 
    deck = new Card[NUMBER_OF_CARDS]; 
    currentCard = 0 ; 
    for(int count = 0; count < deck.length; count++) 
    { 
     deck[count].faceValue = count + 1; 
    } 
} 

public void shuffle() { 
    currentCard = 0; 
    for (int first = 0; first < deck.length; first ++){ 
     int second = randomNumbers.nextInt(NUMBER_OF_CARDS); 
     int temp = deck[first].faceValue; 
     deck[first].faceValue=deck[second].faceValue; 
     deck[second].faceValue = temp; 
    } 
} 

public Card dealCard(){ 
    Card temp = new Card(); 
    temp.faceValue = 0; 
    temp.File = ""; 
    if(currentCard < deck.length) 
    { 
     temp.faceValue = deck[currentCard].faceValue/4; 

     int suit = deck[currentCard].faceValue % 4; 
     String suitString = ""; 
     switch (suit){ 
     case 0: 
      suitString = "c"; 
     case 1: 
      suitString = "d"; 
     case 2: 
      suitString = "h"; 
     case 3: 
      suitString = "s"; 
     } 

     Integer face = temp.faceValue/4 ; 
     String faceString = face.toString(); 
     temp.File = faceString + suitString + ".png"; 

     switch (temp.faceValue){ 
     case 11: 
      temp.faceValue = 10; 
     case 12: 
      temp.faceValue = 10; 
     case 13: 
      temp.faceValue = 10; 
     } 

     return temp; 
    } 

    else 
     return temp; 
} 
} 
+1

我相信你的Logcat还有更多。请发布所有红线,他们告诉我们NullPointerException的确切行号。 – Sam

+0

我添加了来自logcat的红线的其余部分。不确定NullPointerException的哪条线...... – lasmith

+0

它在第17行的'DeckOfCards.java'中:'由...引起:java.lang.NullPointerException ...在com.smith.blackjack.DeckOfCards。 (DeckOfCards.java:17)'如果您仍然需要帮助,请发布此类中的相关代码。 – Sam

回答

1

deck[count],每个值都是null。建议您先制作一张牌,然后设置faceValue

for(int count = 0; count < deck.length; count++) 
{ 
    deck[count] = new Card(); 
    deck[count].faceValue = count + 1; 
} 

新的logcat:

的错误状态:RuntimeException: Assetmanager has been closed
所以我会删除此行:assets.close();

+0

我收到了一个新错误。我发布了更新的logcat。它正在讨论action_menu_layout.xml,但我不确定它来自哪里? – lasmith

+0

我添加了一个新的答案。如果这有帮助,请点击复选标记以接受我的回答。如果您还有其他错误,请发布一个新问题,因为这不是原始问题的一部分。 – Sam

+0

好的。你非常有帮助。谢谢。 – lasmith

0

或者:

for(int count = 0; count < deck.length; count++) 
{ 
    Card card= new Card(); 
    card.setFaceValue(count+1); 
    deck[count] = card; 
} 
相关问题