数组是否为空?

问题描述:

所以我试图弄清楚我的代码中ArrayOutOfBoundException错误的可能来源。数组是否为空?

代码的目的是要打印一堆卡,一个记事本文件,像这样:

public void printCardPiles (PrintWriter writer) 
{ 
    writer.println("Piles: "); 

    for (int i = 0; i < piles.size(); i++)  

    { 

     writer.println(); 
     MyArrayList<Card> tester = piles.get(i).getList();  

     writer.print(tester.toString()); 


    } 

} 

的问题是我不断收到一个ArrayIndexOutOfBoundsException,但我不能完全弄清楚其中源来自。

我发现即使我改变了代码:

public void printCardPiles (PrintWriter writer) 
{ 
    writer.println("Piles: "); 

    for (int i = 0; i < 1; i++) // CHANGE: i < piles.size() to i < 1 
    { 

     writer.println(); 
     MyArrayList<Card> tester = piles.get(i).getList(); 


     writer.print(tester.toString()); 


    } 

} 

我仍然得到越界异常不管。

例外指向writer.print(tester.toString());行,那么这可能是源?确切的例外是如下(添加的上下文注释):

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 
at Card.toString(Card.java:134)       // Sets up a card object  
at java.lang.String.valueOf(String.java:2994) 
at java.lang.StringBuilder.append(StringBuilder.java:131) 
at MyArrayList.toString(MyArrayList.java:168) 
at Table.printCardPiles(Table.java:199)     // The exception location 
at SortCardGame.playGame(SortCardGame.java:113)   // Where the exception's method is being called from 
at SortCardGame.main(SortCardGame.java:52)    

这是否意味着代码正在使用一个空数组(在这种情况下空数组将桩)。这会导致异常?或者是别的什么?

注:的toString()的卡看起来像这样还有:

public String toString() 
{ 
    String printString = RANKS[rank - 1] + SUITS[suit - 1]; // RANKS is the the array holding all the possible Ranks 
                   // rank is what rank the current card is 
                   // Same as the above 
    return printString; 
} 

我感谢大家的帮助,我知道这是很含糊,但因为需要,我可以提供更多的细节。我主要在寻找一些想法,从哪里开始寻找问题,或者可能导致问题的原因。

编辑:根据要求我添加卡类的整体。卡类

public class Card implements Comparable<Card> 
{ 
// For printing the card rank 

public static String[] RANKS = 
{ 
    " A", " 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9", "10", " J", " Q", " K" 
}; 

// For printing the card suit 

public static String[] SUITS = 
{ 
    "-C", "-D", "-H", "-S" 
}; 

// private instance variables 

private int rank; 
private int suit; 

// Default Constructor: initialize to Ace of Clubs 

public Card() 
{ 
    rank = 1; 
    suit = 1; 
} 

// Two-Param Constructor : initialize rank and suit 

public Card (int initRank, int initSuit) 
{ 
    rank = initRank; 
    suit = initSuit; 
} 

// Copy constructor: Copies a Card from another Card 

public Card (Card otherCard) 
{ 
    otherCard.rank = rank; 
    otherCard.suit = suit; 
} 

// Returns relative position of this Card to someCard. 
// This compares the Cards, first by rank: Aces low, King High 
// then Suit within rank: CLUB=1, DIAMOND=2, HEART=3, SPADE=4 

public int compareTo (Card someCard) 
{ 
    if (rank > someCard.rank) 
    { 
     if (suit > someCard.rank) 
     { 
      return 1; 
     } 
     else if (suit < someCard.rank) 
     { 
      return -1; 
     } 
     else 
     { 
      return 0; 
     } 
    } 
    else if (rank < someCard.rank) 
    { 
     if (suit > someCard.rank) 
     { 
      return 1; 
     } 
     else if (suit < someCard.rank) 
     { 
      return -1; 
     } 
     else 
     { 
      return 0; 
     } 
    } 
    else 
    { 
     if (suit > someCard.rank) 
     { 
      return 1; 
     } 
     else if (suit < someCard.rank) 
     { 
      return -1; 
     } 
     else 
     { 
      return 0; 
     } 
    } 



} 



// Determines whether this Card has the same rank and suit 
// as another Card passed in - Note cast of obj to Card 

@Override 
public boolean equals (Object obj) 
{ 
    Card someCard = (Card) obj; 
    return (someCard.compareTo (this) == 0); 
} 

// Print the card's rank and suit using the static 
// String arrays defined about 

public String toString() 
{ 
    String printString = RANKS[rank - 1] + SUITS[suit - 1]; 
    return printString; 
} 

}

快速注意,我没有写了equals()或toString()方法。

+0

您可以发布错误 –

+4

的完整堆栈跟踪如果'rank'(*和/或*'suit')为“0”那么你会得到这种例外(他们有什么价值?) –

+0

张贴您的详细信息'卡'类请 – Jerry06

我猜你正在使用复制构造函数的问题。这个问题使实例将有rank & suit是0。这使toString运行不正常

public Card (Card otherCard) 
{ 
    otherCard.rank = rank; 
    otherCard.suit = suit; 
} 

这应该是

public Card (Card otherCard) 
{ 
    this.rank = otherCard.rank; 
    this.suit = otherCard.suit; 
} 

我觉得异常,因为这条线的存在的

String printString = RANKS[rank - 1] + SUITS[suit - 1]; 

请确保数值为rank-1suit-1大于或等于0. rank> = 1且suit> = 1