【问题标题】:Cannot find symbol for hasNext() and next() methods for my Java card game找不到我的 Java 纸牌游戏的 hasNext() 和 next() 方法的符号
【发布时间】:2020-03-27 16:04:58
【问题描述】:

它在 hasNext() 和 next() 方法下有一个红色下划线。它给出的错误是:

找不到符号

符号:方法 hasNext()

位置:Deck类型的可变甲板

next() 方法显示相同的错误。我尝试通过在 House 构造函数中添加 deck = new Deck(); 来创建一个新的 Deck 对象,但它给了我错误:

未报告的异常IOException;必须被抓住或宣布被扔掉

我用谷歌搜索了这意味着什么,并读到也许我需要一个 try catch 块,但我不完全明白为什么。

public class House
{
    private double currentBet;          // Player's current bet
    private double pot;                 // Amount of the pot in play
    private Card firstCard;             // First card to be dealt
    private Card secondCard;            // Second card to be dealt
    private Card thirdCard;             // Third card to be dealt
    private Deck deck;                  // The card deck to be used
    private DeckIterator deckIterator;  // The card deck to be used

   /**
     * Private helper method that returns the next card in the deck.  
     * If the end of the deck is reached, it shuffles the deck and 
     * returns the first card off the deck.
     * @return Card card;
     */ 
    private Card dealCard()
    {
        if(!deck.hasNext())
        {
            deck.shuffle();
        }
        return deck.next();
    }

这是 Deck 类的 sn-p。这是另一个团队成员写的:

public class Deck {
    private Card[] deck;
    private int currentCard; //index of next card to be dealt
    private int remainingCards;
    private BufferedImage tempCardImage;


    /**
     * Constructor to build a deck of cards
     */
    public Deck () throws IOException
    {
    String[] Faces = {"2", "3", "4", "5", "6", "7",
                        "8", "9", "10", "Jack", "Queen",
                        "King", "Ace"};
    String[] Suits = {"Diamonds", "Clubs", "Hearts", "Spades"};

    deck = new Card[52];
    currentCard = 0;

    ~~~irrelevant code here~~~ 
    }

public Iterator<Card> iterator(){
    return new DeckIterator( this );
}

public class DeckIterator implements Iterator<Card> {
    private Deck d;
    private int pos;
    DeckIterator( Deck d ){
        this.d = d;
    }

    @Override
    public boolean hasNext(){
        return pos < d.deck.length;
    }

    @Override
    public Card next(){
        if( pos >= d.deck.length ){
            throw new NoSuchElementException( "No more cards in deck" );
        }
        return d.getCard( pos++ );
    }

        @Override
        public void remove() {
            throw new UnsupportedOperationException("Not supported yet."); }
}
}

这是我根据你们提出的建议修改的代码:

public class House
{
    private double currentBet;          // Player's current bet
    private double pot;                 // Amount of the pot in play
    private Card firstCard;             // First card to be dealt
    private Card secondCard;            // Second card to be dealt
    private Card thirdCard;             // Third card to be dealt
    private Deck deck;                  // The card deck to be used

    DeckIterator deckIterator = deck.iterator();

    /**
     * Constructor that receives that amount of the buy in and sets the pot.
     * @param buyIn 
     */
    public House(double buyIn)
    {     
        pot = buyIn;
    }

   /**
     * Private helper method that returns the next card in the deck.  
     * If the end of the deck is reached, it shuffles the deck and 
     * returns the first card off the deck.
     * @return Card card;
     */ 
    private Card dealCard()
    {
        if(!deckIterator.hasNext())
        {
            deck.shuffle();
        }
        try
        {
            deckIterator.next();
        }
        catch (NoSuchElementException e)
        {
            System.out.println(e);
        }
        return deckIterator.next();
    }

【问题讨论】:

  • 你需要为 Deck 类显示签名
  • 这些方法在DeckIterator,而不是Deck。如果你要调用它们,你需要一个 DeckIterator 类型的变量。
  • 你的 Deck 类里面有什么?如果它不是一个集合,那么你不能使用这两种方法
  • 抱歉,我现在添加了更多的 Deck 类。谢谢。

标签: java exception methods io


【解决方案1】:

你得到那个例外是因为在next()throw new NoSuchElementException。当你使用next()时,比如dealCard(),你需要处理确实抛出这个异常的情况。

因此,您需要将 deck.next() 放入 try-catch 块中。

try {
    return deck.next()
} catch (NoSuchElementException e) {
    System.out.println(e.printStackTrace());
    // Do something here
}

【讨论】:

    【解决方案2】:

    您似乎正在尝试使用 DeckIterator 类中的 hasNext() 和 next()。

    private Deck deck; 替换为private DeckIterator deckIterator;

    【讨论】:

    • 给我一些下次考虑的东西,谢谢!
    【解决方案3】:

    DeckIterator 本质上包装了Deck 类型。 Deck 有一个 iterator() 方法,所以你只需要这样做:

    DeckIterator deckIterator = deck.iterator();
    

    然后在dealCard 中将deck 引用替换为deckIterator

    正如其他人指出的那样,您需要在对deckIterator.next() 的调用周围使用try/catch

    【讨论】:

    • 谢谢!我已经添加了我修改后的代码。对于 DeckIterator,它给了我错误 “找不到符号:类 DeckIterator。位置:类 House”。在System.out.println(e.printStackTrace()); 中,它给了我错误“此处不允许无效类型”。抱歉,我可能做错了一些非常简单的事情。
    • 确保您的House.java 文件导入了定义DeckIterator 的适当包。此外,您在 House 构造函数中声明了 DeckIterator deckIterator = ...。您需要将声明与其余的变量声明一起移至类而不是构造函数。
    • 再次感谢您。我再次修改了我的代码,它没有给我任何错误。你能检查一下这次看起来还好吗?谢谢。
    • 我更新了我的答案,因为我刚刚意识到 Deck 有一个 iterator() 方法。
    • 谢谢。我更新了我的代码,它下划线 DeckIterator deckIterator = deck.iterator(); 并给出消息:“不兼容的类型:Iterator 无法转换为 Deck.DeckIterator”
    猜你喜欢
    • 2023-03-28
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多