2013-04-16 3 views
3

Я не уверен, что случилось, и мой профессор тоже в тупике. Условие цикла while прекращается только в том случае, если условие выполняется сразу. Как только цикл запущен, условие выполнения больше не останавливает его, и оно просто продолжается. Это похоже на внешний вид, который не проверяет состояние? Ниже мой код. Спасибо за любую помощь.Хотя цикл не заканчивается даже при выполнении условия - Java

import java.io.*; 
    import java.util.*; 


public class createPhoneList { 

    public static void main(String[] args) { 

     DataOutputStream ostream;//creates output stream 
     Scanner input = new Scanner(System.in);//creates scanner in object 
     final String DONE = "DONE";//will be used to end data entry loop 
     String firstName; 
     String lastName; 
     long phoneNumber; 

     try{ 
      ostream = new DataOutputStream(new FileOutputStream("javaContactsUnit4Assignment.txt")); 
      System.out.print("Enter First Name or type 'DONE' to quit: "); 
      firstName = input.nextLine(); 
      while(!firstName.equalsIgnoreCase(DONE)){ 
       /* 
       * Error occuring at runtime where while loop terminates only if 
       * "done" is typed first, but once the loop is running "done" no longer 
       * stops it. Not sure what is wrong... 
       */ 
       input.nextLine(); 
       System.out.print("Please enter Last Name: "); 
       lastName = input.nextLine(); 
       System.out.print("Please enter the Phone Number(with NO DASHES, as they will cause a fatal error): "); 
       phoneNumber = input.nextLong(); 
       ostream.writeUTF(firstName); 
       ostream.writeUTF(lastName); 
       ostream.writeLong(phoneNumber); 

       System.out.print("Enter First Name or type 'DONE' to quit: "); 
       firstName = input.nextLine(); 
       } 

     } 
     catch(IOException e){ 
      System.err.println("Error opening file."); 
     } 
     catch(InputMismatchException e){ 
      System.err.println("Invalid data was entered. Please try again."); 
     } 
     catch(Exception e){ 
      System.err.println("You encountered a fatal error. Please try again."); 
     } 

    } 
} 

ответ

4

Вы должны добавить еще input.nextLine(); после phoneNumber = input.nextLong();.

Это потому, что команда input.nextLong() считывает только длинное значение (и пропускает \n, который является ключом ввода, который вы нажимаете сразу после).

Итак, когда вы продолжаете читать с input.nextLine(), вы получаете \n, а не "done", поэтому ваша петля никогда не заканчивается. Поэтому добавление еще input.nextLine() будет «ласточка»\n, а следующая будет читать настоящую строку.

+0

Итак, почему это все еще испортится, когда я изменяю все переменные типа «Long» на «Int»? Изменение, которое должно было зафиксировать его, если это было так, как вы говорите, но это не так. Это был очень хороший ответ. – user2286647

+0

То же самое происходит и для 'nextInt', просто добавьте еще одну' nextLine' после того, как вы прочтете int/long/double .. см. Мои объяснения. – Maroun

+0

Спасибо. Это сработало. – user2286647

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