Бесконечный l oop с s c .hasNextLine () - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь работать с вводом, но у меня проблемы ... если я использую код ниже, он не заканчивается ... поэтому я нахожусь в бесконечном l oop. и он пишет что-то вроде этого, даже когда мой ввод имеет конец файла:

...
A number has not been parsed from line n
A number has not been parsed from line n+1
A number has not been parsed from line n+2
... (infinite)

, но я хочу вместо этого это:

...
End of input detected!

Ввод выглядит так:

1
2
3
4
5
double[] numbers = new double[10];
int counter_number = 0;
while (sc.hasNextLine()) {
        ...
        line++;
        if(sc.hasNextDouble()) {
            numbers[counter_number] = sc.nextDouble();
            counter_number++;
        }
        else{
            System.out.println("A number has not been parsed from line "+ line);
            continue;
        }
        if (sc.hasNextLine() == false) {
            System.err.println("End of input detected!");
        }
        if (((counter_number)==10) || ((sc.hasNextLine() == false) 
                ...
            counter_number = 0;
        }
    }

пока этот l oop никогда не закончится? Я видел учебники, где они использовали "while (s c .hasNextLine ())", и все закончилось. Я начинающий с java.

Ответы [ 2 ]

0 голосов
/ 08 марта 2020
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
    double[] numbers = new double[10];
    int counter_number = 0;
    int line = 0;

    while (sc.hasNextLine()){

        line++;

        String thisLine = sc.nextLine();
        // this is what i wrote.

        if(thisLine.trim().isEmpty()) {
            // if the line is empty, will exit the loop.

            System.out.println("lines: "+line); // lines
            System.out.println("End of input detected!"); // end.
            break;
        }

        try {
            // if the input is a double
            numbers[counter_number] = Double.parseDouble(thisLine);
            counter_number++;

        } catch (NumberFormatException e) {
            // if not
            System.out.println("A number has not been parsed from line "+ line);
            continue;
        }

        // idk
        if (counter_number == numbers.length) {
            counter_number = 0;
        }
    };

}

FIX. Я не буду закрывать сканер и ... ты попробуй с этим. Этот код заканчивается, когда я набираю пустую строку.

0 голосов
/ 07 марта 2020

единственное выполнение, которое у вас есть, которое выполняет читателя, это sc.nextDouble(), но это происходит только в том случае, если sc.hasNextDouble() возвращает true. Это означает, что если ваш код встретится с не двойным вводом, он застрянет навсегда

И в качестве общего замечания - sc.hasNextLine() == false следует заменить на !sc.hasNextLine()

...