数组是否为空?
问题描述:
所以我试图弄清楚我的代码中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()方法。
答
我猜你正在使用复制构造函数的问题。这个问题使实例将有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-1
和suit-1
大于或等于0. rank> = 1且suit> = 1
您可以发布错误 –
的完整堆栈跟踪如果'rank'(*和/或*'suit')为“0”那么你会得到这种例外(他们有什么价值?) –
张贴您的详细信息'卡'类请 – Jerry06