Java ArrayList打印为空?

Java ArrayList打印为空?,java,arraylist,Java,Arraylist,我的问题很简单。当输入=1时发送x值时,该方法应将x值添加到al ArrayList中。它会这样做,但当我试图打印al的值时,它会打印为空 头等舱: import java.util.Scanner; public class ToDo { Scanner s = new Scanner(System.in); Scanner g = new Scanner(System.in); void start() { IncompleteTasks inc

我的问题很简单。当输入=1时发送x值时,该方法应将x值添加到al ArrayList中。它会这样做,但当我试图打印al的值时,它会打印为空

头等舱:

import java.util.Scanner;

public class ToDo {

    Scanner s = new Scanner(System.in);
    Scanner g = new Scanner(System.in);

    void start() {
        IncompleteTasks incompletetasks = new IncompleteTasks();
        CompleteTasks completetasks = new CompleteTasks();
        AllTasks alltasks = new AllTasks();
        int input = 999;
        String x = "";

        while (input != 0) {

            System.out.println("What would you like to do? Type '0' to cancel");
            System.out.println();
            System.out.println("1. Add a task"); // done
            System.out.println("2. View current tasks");
            System.out.println("3. Delete a task"); // done
            input = s.nextInt();
            if (input == 1) {
                while (!x.equals("quit")) {
                    System.out.print("Enter a task: (Type 'quit' to finish! ");
                    x = g.nextLine();
                    if (x.equals("quit")) {
                        start();
                    }
                    else {
                        incompletetasks.IncompleteTasksAdd(x);
                    }

                }

            }
            else if (input == 2) {
                System.out.println("\t1. All  Tasks");
                System.out.println("\t2. Complete Tasks");
                System.out.println("\t3. Incomplete Tasks");
                input = s.nextInt();
                if (input == 1) {
                    alltasks.AllTasks();
                }
                else if (input == 2) {
                    completetasks.CompleteTasks();
                }
                else if (input == 3) {
                    incompletetasks.IncompleteTasksDisplay();
                }
                else if (input == 0) {
                    System.exit(0);
                }

                else {
                    System.out.println("\t\t\t\tInvalid choice! Try again!");
                    start();
                }
            }

            else if (input == 3) {
                System.out.println("hello");
                x = s.nextLine();
                incompletetasks.IncompleteTasksDelete(x);
            }
            else if (input == 0) {
                System.exit(0);
            }
            else {
                System.out.println("\t\t\t\tInvalid choice! Try again!");
                start();
            }
        }
    }
}
二等舱:

import java.util.ArrayList;
import java.util.Scanner;

public class IncompleteTasks {

    int counter = 0;
    Scanner g = new Scanner(System.in);
    ArrayList<String> al = new ArrayList<String>();

    void IncompleteTasksDisplay() {
        System.out.println("----------------------------------------------------------");
        for (String f : al) {
            counter++;
            System.out.println(f);
            // System.out.println(counter+". " +al.get(f));
        }
        System.out.println("----------------------------------------------------------");

    }

    void IncompleteTasksAdd(String x) {
        al.add(x);
        System.out.println("\tTask Added!");
    }

    void IncompleteTasksDelete(String x) {
        for (int k = 0 ; k < al.size() ; k++) {
            if (al.get(k) == x) {
                al.remove(x);
            }
        }
    }
}
我是java新手,所以如果我在其他部分的代码编写不好,或者我遗漏了一些非常明显的东西,请不要感到惊讶。我感谢所有能得到的帮助,因为我被难倒了,我不知道我做错了什么。

这句话:

IncompleteTasks incompletetasks = new IncompleteTasks();
start();
声明一个局部变量
incompletetasks
,该变量特定于当前对
start()
的调用,并将其初始化为新的空任务列表

这一行:

IncompleteTasks incompletetasks = new IncompleteTasks();
start();
创建对
start()
的新的、单独的调用,因此该调用将有一个单独的
incompletetasks
变量,并且不会有任何关于您已添加所有内容的
incompletetasks
变量的信息

没有真正的理由认为
start()
需要调用自身

解决此问题的最快方法是更改此选项:

while (input != 0){
为此:

mainloop: while (input != 0) {
continue mainloop;
(其中,
mainloop
是一个标签,为while循环提供了一个名称,以便您可以引用它)以及几乎每次出现这种情况:

start();
为此:

mainloop: while (input != 0) {
continue mainloop;
(大致意思是“返回到名为
mainloop
”的循环的开头)


更好的解决方法是将方法拆分为更小的部分。这将允许更清晰的代码。一般来说,一个方法最好不要有嵌套循环(虽然有很多异常,所以不要把它当作硬规则)。

我不是专家,但是为什么不使用switch case而不是if-else if.。我听说过一个switch case,但我还没有学会,尽管它是我的优先事项,所以我很快就会学会它。谢谢您的建议。请在调用nextLine()后使用nextLine()。这样您就不需要两个Scanner实例。e、 g.
input=s.nextInt();s、 nextLine()棒极了,老兄,解决了这个问题,我是新手,但我有点明白你的意思,谢谢你的帮助@塔森特,如果你得到了答案,你应该接受答案。只要点击正确的标志。