Почему я могу вводить что-либо для своей операции?

Итак, я пытаюсь сделать простой калькулятор в java, но не знаю, как получить ввод для какой операции. Программа запрашивает два номера, потом запрашивает оператора. Все работает нормально, когда я запускаю его, пока не доберусь до типа операции. Компилятор просто пропускает его и даже не позволяет мне ничего вводить для него. Любые подсказки?

Scanner keyboard = new Scanner(System.in);

double x;
double y;
double sum =0;
double minus =0;
double times =0;
double divide =0;
double nCr =0;
String Op;

System.out.print("X: ");
x = keyboard.nextDouble();
System.out.print("Y: ");
y = keyboard.nextDouble();
System.out.print("Op: ");
Op = keyboard.nextLine();

person Squash    schedule 27.05.2013    source источник
comment
прошу прощения за "а" и "б". я переключил его на «x» и «y», чтобы он совпадал   -  person Squash    schedule 28.05.2013
comment
См.: stackoverflow.com/questions/5032356/using-scanner-nextline   -  person maybeWeCouldStealAVan    schedule 28.05.2013
comment
возможный дубликат проблемы со сканером при использовании nextLine после nextXXX   -  person Eng.Fouad    schedule 28.05.2013


Ответы (3)


Пытаться:

System.out.print("X: ");
x = Double.parseDouble(keyboard.nextLine());
System.out.print("Y: ");
y = Double.parseDouble(keyboard.nextLine());
System.out.print("Op: ");
op = keyboard.nextLine();

Это проанализирует число, которое вы вводите в Double, и прочитает возврат каретки.

Если вам нужен контроль ошибок (если пользователь вводит строку вместо числа):

Boolean check = true;

do
{
    try
    {
        //The code to read numbers
    }
    catch(InputMismatchException e)
    {
        System.err.println("Please enter a number!");
        check = false;
    }
}
while(check == false)
person Jhon    schedule 27.05.2013
comment
большое спасибо! Это работает, но я не понимаю, почему это так. Что именно делает разбор? - person Squash; 28.05.2013
comment
keyBoard.nextLine() прочитает ввод как String, затем Double.parseDouble попытается преобразовать это String в Double. Если он не может разобрать его, он будет выдавать InputMismatchException всякий раз, когда пользователь вводит что-то, что не является числом (например: пользователь вводит «Привет»). - person Jhon; 28.05.2013

Вместо

Op = keyboard.nextLine();

Попробуйте использовать

Op = keyboard.next();

Похоже на nextLine(); вызывает проблему при вызове с помощью таких методов, как nextInt(), nextDouble().

Наблюдение: если nextLine() вызывается отдельно, этого не происходит.

person dilusha manjari    schedule 29.05.2013

В основном nextDouble не распознает возврат каретки. Используйте nextLine после каждого nextDouble.

person BlackHatSamurai    schedule 27.05.2013