Проблема в цикле при использовании метода в Java - PullRequest
2 голосов
/ 07 августа 2010

Я делаю простую программу относительно методов.Но у меня есть одна проблема.Все уже работает, кроме как в цикле.Когда я выберу цикл снова.Программа пропускает ввод имени.И переходит непосредственно к году и разделу.Вот код:

public static void main(String[] args) {
do{
    System.out.println("Input info:");
        name=stringGetter("Name: ");
        yearandsec=stringGetter("Year and section: ");
        sex_code=charGetter("Sex code: " + "\n"  + "[M]" + "\n" + "[F]:");
        scode=intGetter("Scholarship code: ");
        ccode=intGetter("Course code: ");
        units=intGetter("Units: ");

        fee_per_unit=doubleGetter("Fee per unit: ");
        misc=doubleGetter("Miscellaneous: ");
        display();
         switches(scode, units, fee_per_unit, misc);
System.out.println("Another?");
dec=rew.nextInt();
}while(dec==1);




    }

Вот метод получения значения имени вместе с годом и разделом:

public static String stringGetter(String ny){
       String sget;
        System.out.println(ny);
       sget=rew.nextLine();
       return sget;

    }

Я действительно раздражен этой проблемойЯ не имею ни малейшего представления о том, как это исправить.Пожалуйста помоги.спасибо

Ответы [ 3 ]

2 голосов
/ 07 августа 2010

Вот более простая и полная программа, которая воспроизводит ошибку:

public static Scanner rew = new Scanner(System.in);

public static void main(String[] args) {
    int dec;
    do {
        System.out.println("Input info:");
        String name=stringGetter("Name: ");
        String yearandsec=stringGetter("Year and section: ");
        dec=rew.nextInt();
    } while(dec==1);
}

public static String stringGetter(String ny){
    System.out.println(ny);
    return rew.nextLine();
}

Проблема в том, что после вызова nextInt() вызов nextLine() читает до новой строки после int (пустая строка), а не до следующей новой строки.

Если вы измените dec на String и измените dec=rew.nextInt(); на dec=rew.nextLine();, тогда он будет работать нормально.Вот полный пример, который вы можете скопировать и вставить в пустой файл, чтобы убедиться, что он работает правильно:

import java.util.*;

public class Program
{
    public static Scanner rew = new Scanner(System.in);

    public static void main(String[] args) {
        String dec;
        do {
            System.out.println("Input info:");
            String name = stringGetter("Name: ");
            String yearandsec = stringGetter("Year and section: ");
            dec = stringGetter("Enter 1 to continue: ");
        } while(dec.equals("1"));
    }

    public static String stringGetter(String ny){
        System.out.println(ny);
        return rew.nextLine();
    }
}

Вы также можете рассмотреть возможность добавления правильного анализа и проверки в вашу программу.В настоящее время ваша программа будет вести себя нежелательно, если пользователь вводит неверные данные.

1 голос
/ 07 августа 2010

Строка:

dec = rew.nextInt();

Читает значение int из входного потока и не обрабатывает символ новой строки, затем, когда вы возвращаетесь к точке, где вы получаете имя, в которой точка новой строкивсе еще находится в буфере Reader и получает его от stringGetter, возвращающего пустое значение имени.

Измените строку, сделав что-то вроде:

do {
    //....
    s = stringGetter("Another (y/n)? ");
} while ("y".equals(s));
1 голос
/ 07 августа 2010

Ну, вы не сказали нам, что такое "rew", и что делает rew.nextInt().Возможно ли, что rew.nextInt() ожидает, пока пользователь нажмет return, но фактически потребляет только один символ ввода - так, чтобы следующий вызов rew.nextLine() (для имени) сразу же занял остаток этой строки?Я подозреваю, что это то, что происходит, потому что вы используете System.in - обычно чтение из System.in дает любой ввод, только когда вы нажимаете return.

(Возможно, это также проблема только в Windows - мне интересно, использует ли он «\ r» из System.in в качестве разделителя, оставляя «\ n» в буфере. Не уверен.)

Для проверкипопробуйте набрать «1 Джон», когда вас спросят, продолжать или нет - я думаю, что в качестве следующего имени будет использоваться «Джон».

По сути, я думаю, что использование Scanner.nextInt()будут проблемы, когда следующий вызов будет Scanner.nextString().Возможно, вам лучше использовать BufferedReader и повторно вызывать readLine(), а затем анализировать данные самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...