【问题标题】:Java loop won't work without println() statement如果没有 println() 语句,Java 循环将无法工作
【发布时间】:2021-01-05 21:06:08
【问题描述】:

我目前正在学习 Java 入门级编程课程。我有一个函数应该从口袋妖怪列表中随机选择两个随机不同的口袋妖怪。起初,代码不起作用,只是无限地重复执行while循环。我在 println 语句中添加了用于调试的功能,突然该功能完美运行。 函数如下所示:

public boolean addRandomPokemon()
{
    boolean runCheck = true;
    boolean canUse = true;
    
    while (runCheck)
    {
        int rand = Randomizer.nextInt(3);
        for (int i = 0; i < pokeDeck.size(); i++)
        {
            System.out.println();
            if(pokeDeck.get(i).getName().equals(POKEMON_NAMES[rand]))
            {
                canUse = false;
            }
        }
        if (canUse)
        {
            Pokemon poke = new Pokemon(POKEMON_NAMES[rand]);
            pokeDeck.add(poke);
            runCheck = false;
        }
    }
    return true;
}

其中整数 rand 是一个随机整数 (0,3)。任何人都可以解释为什么会发生这种情况,并为这个问题提供更好的解决方案。简单的解释是首选,因为我在编程方面不是很有经验。 谢谢!

【问题讨论】:

  • 欢迎您。您以一种很好的方式发布了您的问题;)
  • 您从哪个包中使用随机发生器?
  • Randomizer 是作为作业的一部分创建的类

标签: java arrays loops infinite println


【解决方案1】:

当你的 pokeDeck 至少有一个元素并且满足 if 条件时,你将 canUse 布尔值设置为 false,这样你就不会在第二个 if 中输入了

    if (canUse)
    {
        Pokemon poke = new Pokemon(POKEMON_NAMES[rand]);
        pokeDeck.add(poke);
        runCheck = false;
    }

所以你的 runCheck 布尔值始终为真,所以循环是无限的。

您可以修复此行为,添加如下 else 语句:

    if (canUse)
    {
        Pokemon poke = new Pokemon(POKEMON_NAMES[rand]);
        pokeDeck.add(poke);
        runCheck = false;
    } else {
        canUse = true;
    }

所以你有另一个机会在下一个循环中退出你的循环。

println 对你的无限循环没有影响

【讨论】:

    【解决方案2】:

    我认为 System.out.println() 对您的问题没有影响。该语句即将将任何值打印到控制台。还要确保你的 pokeDeck 在你的 POKEMON_NAMES 数组中不包含任何 pokemon,因为它会将 canUse 更改为 false,那么你的 runCheck 将始终保持为 true。

    排列代码:

    public boolean addRandomPokemon()
    {
    
        boolean runCheck= true;
        boolean status= false; // If we could insert a pokemon it will be true
    
        ArrayList<Integer> index= new ArrayList<>();
        for(int i=0; i<POKEMON_NAMES.length; i++) index.add(i); //We create the index pool for selection.
        Random rand= new Random(System.currentTimeMillis()); // Current times seed for Random
    
        while (index.size()>0 && runCheck)
        {
            
            int x= rand.nextInt(index.size());
            int randPoke= index.remove(x);
            
            for (int i = 0; i < pokeDeck.size(); i++)
            {
                if(pokeDeck.get(i).getName().equals(POKEMON_NAMES[randPoke]))
                {
                    break;
                }
                
                Pokemon poke = new Pokemon(POKEMON_NAMES[randPoke]);
                pokeDeck.add(poke);
                runCheck = false;
                status= true;
            }
        }
        return status;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-21
      • 1970-01-01
      • 2020-08-10
      • 2021-05-30
      • 2014-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      相关资源
      最近更新 更多