【问题标题】:Error with infinite loop [duplicate]无限循环错误[重复]
【发布时间】:2013-12-24 14:01:14
【问题描述】:

很多次我运行这个,有一个无限循环问题,但我根本无法找出它是什么/在哪里。其他时候,它工作正常。在无限错误运行期间,程序甚至没有运行我告诉程序显示 arrayList 的初始部分。我有一个名为dailyPlanetStreet 的arrayList,其中填充了Goodguy Badguy Person 或NormalGuy 类的对象。在我下面的删除机制中,如果坏人的一侧有一个普通人/人,我会删除那个人/普通人。如果两边都有一个普通人/人,我会随机删除其中一个。另外,每次我删除一个时,我都会将另一个人/普通人从日常星球街道随机移动到另一个称为安全地的数组列表。

例如,无限错误运行可能如下所示:

8
8
8
8
8
8

请帮我找出问题

import java.util.ArrayList;
public class GothamLikeAdventureTown 
{
    static int y=5;
    static int x=3;

    static ArrayList<Person> dailyPlanetStreet=new ArrayList<Person>();
    static ArrayList<Person> safetyLand=new ArrayList<Person>();
    static ArrayList<Person> unfortunatelyFatallyWoundedPeople=new ArrayList<Person>();

    public static void rescue() {
        int goodpos=0;
        int randompos=(int)(Math.random()*dailyPlanetStreet.size());
        for (int counter1=0; counter1<dailyPlanetStreet.size(); counter1++){
            if (dailyPlanetStreet.get(counter1).name()!="Kent Clark") {goodpos=counter1; }
        }
        dailyPlanetStreet.add(randompos,dailyPlanetStreet.remove(goodpos));

    }



    public static void tosafety() {
        System.out.println("Got here!");
        int outer=12;
        while (outer!=12){
        int randompos=(int)(Math.random()*dailyPlanetStreet.size());
        if ((dailyPlanetStreet.get(randompos).name()!="Clark Kent") &&  (dailyPlanetStreet.get(randompos).name()!="James Kalvin")) 
        {
            System.out.println("Got into the loop!");
            safetyLand.add(dailyPlanetStreet.remove(randompos));
            outer=12;
        } }
    }
    public static void  remove(int deletepos) {
        unfortunatelyFatallyWoundedPeople.add(dailyPlanetStreet.remove(deletepos)); 
    }

    public static void display(){
        System.out.println();
        System.out.println();
        for (int z=0; z<dailyPlanetStreet.size(); z++)
        {
            if (dailyPlanetStreet.get(z) instanceof BadGuy) System.out.println("badguy");
            else if (dailyPlanetStreet.get(z) instanceof GoodGuy) System.out.println("goodguy");
            else if (dailyPlanetStreet.get(z) instanceof NormalGuy) System.out.println("normal guy");
            else if (dailyPlanetStreet.get(z) instanceof Person) System.out.println("person");
        } 
    }

    public static void main(String args[])
        {
        String[] firstname= {"a ", "b", "c", "d","e","f","g","h","i","j"};
        String[] lastname= {"k ", "l", "m", "n","o","p","q","r","s","t"};
        while (y==x){
            y=(int)(Math.random()*10);
            x=(int)(Math.random()*10);

        }



        for (int z=0; z<10; z++)
        {
            if (z==y)
                {
                    GoodGuy superMan=new GoodGuy( "This looks like a job for superman!"   , "A lot of them"   ,  true , 10   , "Superman"  , "Clark Kent"  , "plumber" , 100  ,   10,10);
                    dailyPlanetStreet.add(superMan);                    }

            else if (z==x)
                {
                    BadGuy superMan=new BadGuy( "haha"   , "Darkness"   ,  true , 10   , "Batman"  , "James Kalvin"  , "farmer" , 100  ,   10,10);
                    dailyPlanetStreet.add(superMan);
                                                                }   
            else  if (((int)(Math.random()*2)+1)==1)
                 {
                    Person superMan=new Person( firstname[(int)(Math.random()*10)]+lastname[(int)(Math.random()*10)], "teacher", 100  , 10,10);
                    dailyPlanetStreet.add(superMan); 
                 }  
            else 
                {
                    NormalGuy superMan=new NormalGuy( firstname[(int)(Math.random()*10)]+lastname[(int)(Math.random()*10)], "teacher", 100  , 10,10);
                    dailyPlanetStreet.add(superMan); 
                }
        }

        display();


        while (dailyPlanetStreet.size()>2){
        for (int counter=0; counter<dailyPlanetStreet.size(); counter++){
            if (dailyPlanetStreet.get(counter).name()=="James Kalvin") 
            {
                if ((counter==0) && (dailyPlanetStreet.get(1).name()=="Clark Kent")) {}
                else if ((counter==0) && (dailyPlanetStreet.get(1).name()!="Clark Kent")) {System.out.println("yo"); remove(counter+1);display();rescue();} 
                else if ((counter==dailyPlanetStreet.size()-1) && (dailyPlanetStreet.get(dailyPlanetStreet.size()-2).name()=="Clark Kent")) {System.out.println("yo"); tosafety();rescue();display();}
                else if ((counter==dailyPlanetStreet.size()-1) && (dailyPlanetStreet.get(dailyPlanetStreet.size()-2).name()!="Clark Kent")) {System.out.println("yo");remove(counter-1);tosafety();rescue();display();}
                else if  (dailyPlanetStreet.get(counter+1).name()=="Clark Kent") {System.out.println("yo");remove(counter-1);tosafety();rescue();display();}
                else if (dailyPlanetStreet.get(counter-1).name()=="Clark Kent") {System.out.println("yo");remove(counter+1); tosafety();rescue();display();}
                else if ((dailyPlanetStreet.get(counter-1).name()!="Clark Kent")&& (dailyPlanetStreet.get(counter+1).name()!="Clark Kent")) 
                {
                    if (((int)(Math.random()*2))==1) {System.out.println("yo");remove(counter+1); tosafety();rescue();display();}
                    else {System.out.println("yo");remove(counter-1);  tosafety();rescue();display();}
                } 

                }
            }
        System.out.println(dailyPlanetStreet.size());
        }


        System.out.println("hi");

        }   

} 

【问题讨论】:

  • 不是重复的!已建议 OP 提出另一个问题,因为主题已经改变。标记问题时请仔细阅读:-/

标签: java arrays arraylist while-loop infinite


【解决方案1】:

您将String== 进行比较,而不是.equals,这是一个常见错误并且不起作用。

例如在你的 while 循环中:

if (dailyPlanetStreet.get(counter).name()=="James Kalvin")

应该改为:

if (dailyPlanetStreet.get(counter).name().equals("James Kalvin"))

以及所有其他比较字符串的情况。

编辑

关于无限循环的问题:

您的 while 循环一直运行到 .size() 小于 2。但在您的 while 循环中,您只有在 dailyPlanetStreet 中的 .name() 值之一是 "James Kalvin" 时才执行某些操作。据我所知,这些值是随机生成/选择的。因此,如果您碰巧没有得到任何 James Kalvins,您将永远在那里循环。

为了能够详细说明为什么它会永远循环,我必须查看您正在使用的 BadGuy 的构造函数..

编辑 2

查看下面的评论后,我发现 while 循环中的所有 if else if 子句都以将字符串与 == 进行比较的条件开头。因此,这些都不会返回 true,也不会做任何事情。请将您所有的....name()=="Something" 更改为....name().equals("Something")

【讨论】:

  • OP 离线告诉我,这两行代码可确保您获得 James Kalvin: BadGuy superMan=new BadGuy( "haha" , "Darkness" , true , 10 , "Batman" , “詹姆斯卡尔文”, “农民”, 100 , 10,10); dailyPlanetStreet.add(superMan);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 2020-06-06
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多