为什么这个infinte循环发生?

时间:2015-11-16 02:58:56

标签: java arrays while-loop infinite-loop

伙计们我真的需要一些帮助:(

我需要创建一个联系人列表,我需要能够在其中创建,编辑,删除,显示和搜索联系人。

但是在我输入数字1(包括一个新数字)并输入名称和数字后,它会进入一个无限循环,我想知道你们是否可以帮助我弄清楚它为什么会发生以及如何解决它。

我很确定它与代码末尾的这个块有关:

while (op!=6)
System.out.println();

但是当我删除它时,循环就不会发生。而不是无限循环,它根本不循环。我现在一直在努力工作几个小时,我似乎无法弄明白。 (我也不允许在这里使用数组列表)

对不起我的英文,谢谢你!

import java.util.Scanner;

public class Vetor45 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        String[] name = new String[1000];
        String nname, auxname;
        int[] tel = new int[1000];
        int ntel, op, cont, i, k, auxtel;

        cont = 0;
        k = 0;

        for (i = 0; i < 1000; i++) {
            name[i] = "Empty";
            tel[i] = 0;
        }

        {

            System.out.println("contact list:");
            System.out.println("1. include a new number");
            System.out.println("2. edit a number");
            System.out.println("3. delete a number");
            System.out.println("4. print all numbers");
            System.out.println("5. search by name");
            System.out.println("6. exit");
            System.out.println("Option:");

            op = scanner.nextInt();

            System.out.println("");

            if (op == 1) {
                if (k <= 999) {
                    while (name[k] != "Empty") {
                        k++;
                    }

                    System.out.println("Enter a name:");
                    name[k] = scanner.next();

                    System.out.println("Enter a number:");
                    tel[k] = scanner.nextInt();
                    k++;
                }

                else {
                    System.out.println("complete");
                }
            }

            else {
                if (op == 2) {
                    i = 0;
                    System.out.println("enter a name:");
                    nname = scanner.next();

                    while (nname != name[i] && i < k - 1) {
                        i++;
                    }

                    if (nname == name[i]) {
                        System.out.println("enter the new number:");
                        ntel = scanner.nextInt();
                        tel[i] = ntel;
                    }

                    else {
                        System.out.println("name not registred");
                    }

                }

                else {
                    if (op == 3) {
                        k--;
                        i = 0;
                        System.out.println("enter a name:");
                        nname = scanner.next();

                        while (nname != name[i] && i < k) {
                            i++;
                        }

                        if (nname == name[i]) {
                            name[i] = "Empty";
                            tel[i] = 0;
                        } else {
                            System.out.println("name not registred");
                        }

                    }

                    else {

                        if (op == 4) {
                            for (i = 0; i <= k - 2; i++) {
                                for (cont = i + 1; cont <= k - 1; cont++) {
                                    if (name[i] == name[cont]) {
                                        auxname = name[i];
                                        name[i] = name[cont];
                                        name[cont] = auxname;
                                        auxtel = tel[i];
                                        tel[i] = tel[cont];
                                        tel[cont] = auxtel;
                                    }
                                }
                            }

                            System.out.println("phone list:");
                            for (i = 0; i < 1000; i++) {
                                if (name[i] != "Empty") {
                                    System.out.println("name: " + name[i]);
                                    System.out.println("tel: " + tel[i]);
                                }

                            }
                        }

                        else {
                            if (op == 5) {
                                i = 0;
                                System.out.println("enter a name:");
                                nname = scanner.next();
                                while (nname != name[i] && i < k) {
                                    i++;
                                }

                                if (nname == name[i]) {
                                    System.out.println("name: " + nname);
                                    System.out.println("Tel: " + tel);
                                } else {
                                    System.out.println("name not registred");
                                }
                            } else {
                                if (op == 6) {
                                    System.out.println("exiting");
                                } else {
                                    System.out.println("option not available");
                                }
                            }
                        }
                    }
                }
            }
            System.out.println();
        }

        while (op != 6)
            System.out.println();
    }
}

3 个答案:

答案 0 :(得分:2)

在这段代码中你甚至没有do / while循环,这是do / while循环的循环:

  do{
     //loop
  }while(op != 6); //don't forget semi colon

你需要为括号制定一些标准,等等。就像现在一样,阅读这段代码真的很难。

答案 1 :(得分:1)

是的,正如你和@Amadan所推测的那样,while (op != 6)就是问题所在。通常,当你循环时,循环中的某些东西必须在你循环的条件下修改某些东西,或者循环中的某些东西必须修改正常的控制流(所以return,{{1} },等等,所以当你看到break时,你应该认为“while (op != 6)是条件中唯一的变量,所以循环中的某些内容必须修改op或者必须是摆脱循环的另一种方式。“

我认为你想要做的是在一段时间之前在大块之前放一个op,然后在块的末尾放置do,所以你这样做:

while

这会将do { ... op = scanner.nextInt(); ... } while (op != 6); 读入int,用它做一些事情,然后在用户输入6时纾困。

答案 2 :(得分:0)

正在运行循环while (op!=6),而不允许对op进行任何更改。

//Rest of the code
    System.out.println();
}

while (op!=6)
    System.out.println();
}
}

循环应该在您需要执行的开始时得到平衡,并且在循环中包含您想要做的所有事情(包括更改op):

for (i=0; i<1000; i++)
{name[i]="Empty"; tel[i]=0;}
while (op!=6)
{
System.out.println("contact list:");
//Rest of the code

当你这样做时,你可能还需要移动一些支撑。但是我不打算完成整个事情/这不在问题的范围内。