2017-10-19 2 views
0

私は私のコードで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; 
} 

}

簡単なメモ、I は等号を書いていない()またはのtoString()。

+0

エラーの完全なスタックトレースを投稿することができます –

+4

'rank'(*および/または*' suit')が '0'の場合 –

+0

あなたの詳細を投稿してください 'Card'クラス – Jerry06

答えて

2

コピーコンストラクタを使用していると思います。問題は、これは間違って

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

toString仕事はこれは私が例外が原因でこの線の発生していると思い

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

する必要がありますインスタンスがrank & suitは0である必要がありますになり

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

rank-1suit-1の値を必ずご確認くださいrank> = 1およびsuit> = 1

関連する問題