2016-11-07 14 views
0

Я пытаюсь написать программу Java, в которой пользователь указывает, сколько «студенческих записей» они хотели бы ввести, а затем имя студента, возраст и GPA, которые затем сохраняется в виде текста. Тем не менее, у меня возникла проблема с моим текстом, который не включает все введенные данные и таинственную висячую новую строку, от которой я не могу избавиться. Вот моя программа:FileWriter не получает всю входную и загадочную болтовню с выпуском новой строки

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

public class CreateFile { 
    public static void main(String[] args) throws IOException { 
     Scanner input = new Scanner(System.in); 
     FileWriter fwriter = new FileWriter("c:\\Students.dat"); 
     PrintWriter StudentFile = new PrintWriter(fwriter); 
     String name = " "; 
     String next = " "; 
     int age = 0; 
     int hm = 0; 
     double gpa = 0.0; 
     System.out.print("How many student records would you like to enter: "); 
     hm = input.nextInt(); 
     for (int x = 1; x <= hm; x++) { 
      System.out.print("Enter Name: "); 
      name = input.nextLine(); 
      input.nextLine(); 
      System.out.print("Enter Age: "); 
      age = input.nextInt(); 
      System.out.print("Enter GPA: "); 
      gpa = input.nextDouble(); 
      next = input.nextLine(); 
      StudentFile.println(name); 
      StudentFile.println(age); 
      StudentFile.println(gpa); 
     } 
     StudentFile.close(); 
     System.exit(0); 
    } 
} 

Здесь образец ввод и вывод, чтобы проиллюстрировать мои вопросы:

run: 
How many student records would you like to enter: 3 
Enter Name: Jon 
Enter Age: 20 
Enter GPA: 3.4 
Enter Name: Bill 

Enter Age: 24 
Enter GPA: 3.6 
Enter Name: Ted 

Enter Age: 34 
Enter GPA: 3.9 

This is the produced text file: 
20 
3.4 
Bill 
24 
3.6 
Ted 
34 
3.9 

Почему не хранить имя вошло? Почему в первой записи нет новой строки, но она есть в других?

ответ

1

Это скорректированное цикл:

for (int x = 1; x <= hm; x++) 
{ 
    System.out.print("Enter Name: "); 
    name = input.next(); 
    input.nextLine(); 
    System.out.print("Enter Age: "); 
    age = input.nextInt(); 
    input.nextLine(); 
    System.out.print("Enter GPA: "); 
    gpa = input.nextDouble(); 
    next = input.nextLine(); 
    StudentFile.println(name); 
    StudentFile.println(age); 
    StudentFile.println(gpa); 
} 

Некоторые вещи, которые вы можете рассмотреть:

  • справиться с IOException - это не должно быть проигнорировано !!
  • Используйте методы hasNextXXX() из Scanner, чтобы проверить, доступно ли что-либо.
  • Рефакторинг использования переменной next, он никогда не используется.
  • Нет необходимости звонить System.exit(0) из основного метода - скорее используйте инструкцию return со значимым значением.
+0

Спасибо! Не могли бы вы объяснить, почему это работает и почему у меня нет? Зачем использовать name = input.next(); вместо input.nextLine() ;? –

+0

С 'nextLine()' после вашего «Enter Name:» вы дважды переходите к следующей строке. Но на самом деле вы хотите иметь только следующую строку, поэтому вам нужно вызвать 'next()'. После этого вы можете пропустить любой дополнительный вход вперед до следующей строки, прочитать целое число и так далее. –

+0

@MarkusL Вы не должны закрывать «Сканер», так как он также закрывает 'System.in', который ** вы ** не выделили, а JVM. Вы должны добавить '@SuppressWarnings (" resource ")'. Я тоже ошибся, потому что компилятор Java дает вам предупреждение, но это не относится к «Сканеру», как упоминалось. – thatguy

1

Проблема в том, что вы используете nextLine(), когда вам нужно использовать next(). Я предполагаю, что вы поставили второй input.nextLine() там, потому что у вас изначально возникла проблема, когда он распечатывал «Enter Name:», а затем сразу же «Enter Age:». nextLine() говорит вашей программе пропустить все, что есть, и не ждать его. Причина, по которой эта парадигма работала вообще для любой вашей записи, заключается в том, что вы положили next = input.nextLine() в нижнюю часть вашего цикла. Вот исправление:

package createfile; 
import java.io.*; 
import java.util.Scanner; 
public class CreateFile { 
    public static void main(String[] args) throws IOException { 
     Scanner input = new Scanner(System.in); 
     FileWriter fwriter = new FileWriter("c:Students.dat"); 
     PrintWriter StudentFile = new PrintWriter(fwriter); 
     String name = " "; 
     String next = " "; 
     int age = 0; 
     int hm = 0; 
     double gpa = 0.0; 
     System.out.print("How many student records would you like to enter: "); 
     hm = input.nextInt(); 
     for (int x = 1; x <= hm; x++) { 
      System.out.print("Enter Name: "); 
      name = input.next(); 
      System.out.print("Enter Age: "); 
      age = input.nextInt(); 
      System.out.print("Enter GPA: "); 
      gpa = input.nextDouble(); 
      StudentFile.println(name); 
      StudentFile.println(age); 
      StudentFile.println(gpa); 
     } 
     StudentFile.close(); 
     System.exit(0); 
    } 
} 

Вы также можете просто переместить ваш input.nextLine() выше name=input.nextLine() и это будет иметь тот же эффект.

1

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

Я предпочел бы это:

System.out.print("How many student records would you like to enter: "); 
    hm = input.nextInt(); 
    input.nextLine(); 
    for (int x = 1; x <= hm; x++) { 
     System.out.print("Enter Name: "); 
     name = input.nextLine(); 
     System.out.print("Enter Age: "); 
     age = input.nextInt(); 
     input.nextLine(); 
     System.out.print("Enter GPA: "); 
     gpa = input.nextDouble(); 
     input.nextLine(); 
     StudentFile.println(name); 
     StudentFile.println(age); 
     StudentFile.println(gpa); 
    } 
+0

Как это работает?Я попытался ввести имя и фамилию, но они не хранили их. –

+0

Можете ли вы подробно напечатать данные о входе и выходе и файле? Я запускаю программу, показанную выше, и все работает так, как я ожидал. –

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

  • Нет связанных вопросов^_^