为什么我不能让我的程序反复运行我的方法(循环)?

时间:2017-07-15 22:03:13

标签: java

这是一个日记程序,允许你在日记中写一些东西(显然)。键入enter并按Enter后,页面将关闭,并将在列表中进行保护。我的问题是,当我有Pages()时它只运行一次;在main方法中,所以我尝试了这个循环。它不适合我,我不知道为什么。需要一些帮助

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

public class NotizbuchKlasse{
    public static void Pages() {
        System.out.println("day 1 : Write something in your diary.");
        System.out.println("Write enter if you are done writing.");
        ArrayList<String> List = new ArrayList<String>();
        String ListInList;
        Scanner write = new Scanner(System.in);
        do {
            ListInList = write.next();
            List.add(ListInList);
        } while (! ListInList.equals("enter"));
        List.remove(List.size()-1);
        write.close();          
        System.out.println("This is now your page. Your page is gonna be created after writing something new.");
        System.out.println(List);
    }

    public static void main(String[]Args){
        boolean run = true;
        do{
            Pages();
        } while(run);
    } 
}

错误:

This is now your page. Your page is gonna be created after writing something 
new.
Exception in thread "main" [hello]
day 1 : Write something in your diary.
Write enter if you are done writing.
java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at NotizbuchKlasse.Pages(NotizbuchKlasse.java:12)
    at NotizbuchKlasse.main(NotizbuchKlasse.java:24)

2 个答案:

答案 0 :(得分:4)

在阅读之前,您需要检查是否有要阅读的内容。您目前不在,这也是您获得NoSuchElementException的原因。

您可以通过Scanner has*方法执行此操作。

例如:

    ArrayList<String> List = new ArrayList<String>();
    Scanner write = new Scanner(System.in);
    while (write.hasNextLine()) {
        String ListInList = write.nextLine();
        if (ListInList.equals("enter")) break;
        List.add(ListInList);
    }
    // No need to remove the last item from the list.

但是,我注意到你的main方法中有一个循环,你在那个循环中调用Pages()。如果您关闭write,也会关闭System.in;关闭流后,您无法重新打开它。因此,如果您在下次调用System.in时尝试从Pages()读取内容,则该流已关闭,因此无需阅读。

请勿致电write.close()。你不应该关闭你一般不开放的溪流;并且你没有打开System.in(JVM在启动时会这样做),所以不要关闭它。

答案 1 :(得分:0)

你想要像这样使用while循环:

while (write.hasNextLine()) {
  ListInList = write.nextLine();
  if (doneWriting(ListInList)) { // Check for use of enter.
    break; // Exit the while loop when enter is found.
  }
  List.add(ListInList); // No enter found. Add input to diary entry.
}

其中doneWriting()是一个方法(你写的!),它检查用户是否输入了enter

Here is the documentation用于扫描程序的next()方法。如果你阅读它,你会发现它会抛出你用掉令牌时遇到的异常。

如果您想要一点关于next()nextLine()的偶然解释here is a question that was asked previously