如果没有println()语句,java循环将无法工作

zwghvu4y  于 2021-06-26  发布在  Java
关注(0)|答案(2)|浏览(375)

我目前正在学习java的入门级编程课程。我有一个函数,可以从pokemon列表中随机选择两个不同的pokemon。起初,代码不起作用,只是无限次地重复执行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)。有谁能解释为什么会发生这种情况,并为这个问题提供更好的解决方案吗。简单的解释是首选,因为我不是很有经验的编程。谢谢!

yuvru6vn

yuvru6vn1#

我认为system.out.println()对您的问题没有影响。此语句即将向控制台打印任何值。还要确保pokedeck在pokemon\u names数组中不包含任何pokemon,因为它会将canuse更改为false,那么运行检查将始终保持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;
}
q5iwbnjs

q5iwbnjs2#

当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 在无限循环中没有效果

相关问题