【问题标题】:Why is this freezing my java program?为什么这会冻结我的 java 程序?
【发布时间】:2013-12-31 14:11:06
【问题描述】:

我正在为我的科学博览会项目制作一个魔方模拟器,但遇到了一些麻烦。此代码应该通过在 sideValues[] 数组中设置不同的颜色值来随机化立方体。这并不复杂,但它总是让我的电脑死机。 (顺便说一下,method1method2method 3JLabels,计数器整数是为了确保每种颜色不超过 9 个,drawAndButtons 是 JPanel 立方体显示在,而 cubeSpace 是 JPanel drawAndButtons 开启。)

method1.setForeground(Color.red);
            method2.setForeground(Color.black);
            method3.setForeground(Color.black);
            for(int h = 1; h <= 54; h++)
            {
                do
                {
                    transfer = generator.nextInt(6) + 1;
                    switch(transfer)
                    {
                        case 1:
                            numy++;
                        case 2:
                            numb++;
                        case 3:
                            numo++;
                        case 4:
                            numg++;
                        case 5:
                            numr++;
                        case 6:
                            numw++;
                        default:
                    }
                    if(numy > 9 || numb > 9 || numo > 9 || numg > 9 || numr > 9 || numw > 9)
                    {
                        rightAmount = false;
                        switch(transfer)
                        {
                            case 1:
                                numy--;
                            case 2:
                                numb--;
                            case 3:
                                numo--;
                            case 4:
                                numg--;
                            case 5:
                                numr--;
                            case 6:
                                numw--;
                            default:
                        }
                    }
                    else
                    {
                        sideValues[h] = transfer;
                        rightAmount = true;
                    }
                }while(rightAmount == false);
            }
            drawAndButtons.add(new graphics());
            cubeSpace.repaint();
            methodValue = 3;
            numy = 0;
            numb = 0;
            numo = 0;
            numg = 0;
            numr = 0;
            numw = 0;
        }

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,请发帖 SSCCE。 2)(但基于预感..)不要阻塞 EDT(事件调度线程)——当这种情况发生时,GUI 将“冻结”。而不是调用Thread.sleep(n) 实现一个摆动Timer 用于重复任务或SwingWorker 用于长时间运行的任务。有关详细信息,请参阅Concurrency in Swing
  • 等一下,在所有奇迹都解决后添加一个休息时间:)
  • 为什么您的switch 中没有任何break;
  • @sᴜʀᴇsʜᴀᴛᴛᴀ 我的双胞胎.....终于找到你了!
  • 在任何情况下都必须使用break;

标签: java swing


【解决方案1】:

假设您的一个以 n 开头的变量 (numy, numb, numo ...) 大于 9,但它在 switch 中的案例索引小于当前 transfer。因此,您不会减少它,并且 do-while 循环不会结束。这可能会导致很长的循环(如果您的转移恰好大于大于 9 的值的 case-index)。请注意,如果您的 n-starting-variables 将被初始化为 0,则永远不会发生这种情况,例如,如果您将它们中的任何一个递增到大于 9,那么您的第二个开关会将其递减。 但是在方法之前你的 n-starting-variables 是如何初始化的?(我的 n-starting-variables 是指 numy、numb、numo...)

更重要的是,由于您的案例中没有使用break,如果您的转移= 1,您将执行所有案例1,2,3,4,5,6和默认值,我不确定如果这是你想在这里做的。据我了解,您想增加由伪随机数transfer 指定的单色块的“数量”。为此,您必须在此处的代码的每个 case 中添加 break;,因此只会执行 case = transfer

【讨论】:

    猜你喜欢
    • 2011-11-13
    • 1970-01-01
    • 2012-01-12
    • 2020-02-23
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多