2013-08-10 3 views
0

Мне сложно понять, почему цикл while не будет на самом деле цитировать. Он проходит один раз и останавливается.Хотя цикл выполняется только один раз

import java.util.*; 

public class mileskm { 
    public static void main(String[] args) { 

     Scanner inp = new Scanner(System.in); 
     boolean continue1 = true; 

     while (continue1 == true) { 

      System.out.println("Would you like to convert m-km or km-m(km for m-km and m for km-m)"); 

      String convert = inp.nextLine(); 
      if (convert.equalsIgnoreCase("km")) { 
       System.out.println("Enter the mileage to be converted."); 
       double num = inp.nextDouble(); 
       double con = num * 1.60934; 
       System.out.println(con); 
       continue1 = true; 
      } else if (convert.equalsIgnoreCase("m")) { 
       System.out.println("Enter the km to be converted."); 
       double num = inp.nextDouble(); 
       double con = num * 0.621371; 
       System.out.println(con); 
       continue1 = true; 
      } else { 
       continue1 = false; 
      } 

     } 
    } 
} 

Я пытаюсь сделать так, чтобы пользователь мог конвертировать единицы более одного раза. Любая помощь приветствуется!

ответ

1

Проблема в том, что при вызове nextDouble() он потребляет номер, но не новую строку, которая приходит после номера. Чтобы исправить это, просто поместите строку кода inp.nextLine(); после звонка nextDouble().


Пример и полное объяснение:

Пусть ваш вклад "км", нажмите клавишу ввода, "123", нажмите клавишу ввода. Затем с точки зрения программы входной поток равен "km\n123\n".

Код String convert = inp.nextLine(); получает значение "km", а также передает входные данные после первого "\n".

Код double num = inp.nextDouble(); получает строку "123" и возвращает значение (double) 123.0. Он останавливает синтаксический анализ, когда видит '\n', но он не потребляет символ - он остается во входном буфере.

В следующей итерации цикла inp.nextLine(); видит "\n" немедленно, поэтому String convert = "";. Это вызывает случай else в вашем цикле, поэтому он выходит из цикла.

1

Если какой-либо из двух условий:

(convert.equalsIgnoreCase("km")) 

или

(convert.equalsIgnoreCase("m")) 

... не true, вы установите booleancontinue1 в false, который нарушит ваш цикл на следующей итерации ,

Пожалуйста, обратите внимание, что, поскольку это логическое, вы можете (и должны) написать while заявление, как например:

while (continue1) { 
    // etc. 
} 

Заметим также, что вы должны попробовать/поймать для Exception с при сканировании для определенных типов , например Scanner.nextDouble, так как это может очень сильно нарушить ваш код с помощью трассировки стека, если ввод имеет неожиданный тип.

+0

Я не понимаю, как бороться с этой последней еще {continue1 = ложь} ... потому что если что-нибудь кроме m или km, я хочу, чтобы он закрылся. – toshkoprogramming

+0

Ничего. Я понял это. Теперь у меня другая проблема, которая возникает очень часто в любой программе, которую я делаю. Как только он проходит цикл один раз, линия ystem.out.println («Вы хотите преобразовать m-km или km-m (км для m-км и m для км-м)»); затем печатает дважды на втором прогоне и каждый пробег после. Что заставляет его печатать дважды каждый раз после первого цикла? – toshkoprogramming

+0

Он не должен печатать дважды за цикл с этим кодом ... конечно, он будет переиздавать (один раз), как только цикл будет итерации. – Mena

0

использование

String convert = inp.next(); 

вместо

String convert = inp.nextLine(); 

nextLine() читает пустую строку из-за System.out.println().

+1

Спасибо за помощь! Оно работает! – toshkoprogramming

1

В вашем коде все еще есть одна проблема с инициализацией вашего объекта сканера в цикле while, это решит вашу проблему с печатью строки 2 раза.Использовать этот

import java.util.*; 

public class mileskm { 
public static void main(String[] args) { 

    Scanner inp; 
    boolean continue1 = true; 

    while (continue1) { 

     System.out.println("Would you like to convert m-km or km-m(km for m-km and m for km-m)"); 
     inp = new Scanner(System.in); 

     String convert = inp.nextLine(); 
     if (convert.equalsIgnoreCase("km")) { 
      System.out.println("Enter the mileage to be converted."); 
      double num = inp.nextDouble(); 
      double con = num * 1.60934; 
      System.out.println(con); 
      continue1 = true; 
     } else if (convert.equalsIgnoreCase("m")) { 
      System.out.println("Enter the km to be converted."); 
      double num = inp.nextDouble(); 
      double con = num * 0.621371; 
      System.out.println(con); 
      continue1 = true; 
     } else { 
      break; 
     } 

    } 
} 
} 

Любезно Check It Это ответ на ваш вопрос написано в комментариях

Смежные вопросы