Java ArrayList打印为空?
我的问题很简单。当输入=1时发送x值时,该方法应将x值添加到al ArrayList中。它会这样做,但当我试图打印al的值时,它会打印为空 头等舱: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
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()代码>棒极了,老兄,解决了这个问题,我是新手,但我有点明白你的意思,谢谢你的帮助@塔森特,如果你得到了答案,你应该接受答案。只要点击正确的标志。