Эта проблема поставила меня в тупик. Я написал метод, который вызывается из цикла. Первое время работает отлично, потом просто зависает.

Это метод:

public static String promptUser(){
    String path = "";
    Scanner reader = new Scanner(System.in);  

    while (!path.contains(ROOT_FOLDER)){
        System.out.println(String.format("Please paste in the directory path from WinSCP, including %s: ", ROOT_FOLDER));

        while (true) {
            if (reader.hasNext()){
                path = reader.nextLine();
                break;
            }
        }
    }
    reader.close();
    return path;
}

И это петля

        while (true) {
        try {
            listFiles(promptUser());
            break;
        } 
        catch (Exception e) {
            e.printStackTrace();
            System.err.println(e.getMessage());
        }
    }

При первом запуске он будет запрашивать у пользователя столько раз, сколько потребуется, чтобы получить нужную информацию (путь к каталогу). Затем он отправляет запрос на FTP-сервер, и если этот путь не существует, я хочу, чтобы он продолжал запрашивать пользователя. Но мой отладчик говорит мне, что на втором этапе он просто зависает:

        if (reader.hasNext()){ 

Никакое нажатие клавиши ввода не заставит его продолжить. При первом вызове promptUser я мог ввести что-то без корневой папки, и он просто продолжал спрашивать, пока не получил корневую папку. Так почему же этого не происходит при втором вызове?

Что здесь происходит?

2
clickcell 20 Апр 2016 в 13:05

2 ответа

Вы не должны использовать break внутри цикла при получении следующего элемента. Это вызывает выход из цикла while(true). Это означает, что вы получите первый предмет и закончите.

Вы должны изменить его примерно так:

while(reader.hasNext()) {
    path = reader.nextLine();
    // do something with the path here...
}
1
GHajba 20 Апр 2016 в 10:12

Прочтите документацию по hasNext()

Возвращает истину, если этот сканер имеет другой токен на входе. Этот метод может блокироваться во время ожидания ввода для сканирования. Сканер не проходит мимо любого ввода. Возвращает: истина тогда и только тогда, когда у этого сканера есть другой токен

Итак, hasNext () ждет, когда вы введете какое-то значение. Он будет ждать, пока не найдет единственную строку, введенную пользователем.

-1
Mangu Singh Rajpurohit 20 Апр 2016 в 10:13