2012-05-16 2 views
3

Я пишу заявку на упражнение в курсе, который я делаю по технологии. Предполагается создать 5 объектов класса Book, который содержит поля данных для названия книги, автора и количества страниц. У меня проблемы с for.. loop. Он пропускает шаг каждый раз после первого цикла, и я не могу понять, почему. Вот мой кодMy java for loop пропускает шаг

import java.util.*; 
public class LibraryBook2 
{ 
    public static void main(String[]args) 
{ 
    String name; 
    String author; 
    int pages; 
    Book[] novel = new Book[5]; 
    novel[0] = new Book(); 
    novel[1] = new Book(); 
    novel[2] = new Book(); 
    novel[3] = new Book(); 
    novel[4] = new Book(); 
    Scanner kb = new Scanner(System.in); 
    for (int i = 0; i< novel.length;) 
    { 
     System.out.println("Please Enter the books title"); 
     name = kb.nextLine(); 
     novel[i].setTitle(name); 
     System.out.println("Please enter the books author"); 
     author = kb.nextLine(); 
     novel[i].setAuthor(author); 
     System.out.println("Please enter the number of pages in this book"); 
     pages = kb.nextInt(); 
     novel[i].setPages(pages); 
     System.out.println(""+novel[i].title); 
     System.out.println(""+novel[i].author); 
     System.out.println(""+novel[i].pages); 
     ++i; 
    } 
    for (int x = 0; x<novel.length; x++) 
    { 
    System.out.print(""+ novel[x].title + "\n" + novel[x].author + "\n" + novel[x].pages); 
    } 
    } 
} 

В течение первого for цикла, то в цикле один раз, печатает книги название, автора и количество страниц я вошел, как и должно быть. Но во второй раз он печатает «Пожалуйста, введите название книги», затем пропустит прямо ко второму println, не дожидаясь ввода. Я новичок в массивах объектов и java в целом, поэтому любая помощь приветствуется. Спасибо заранее.

ответ

0

изменить код так:

public static void main(String []arg){ 
    String name; 
    String author; 
    String pages; 
    Book[] novel = new Book[2]; 
    novel[0] = new Book(); 
    novel[1] = new Book(); 
    novel[2] = new Book(); 
    novel[3] = new Book(); 
    novel[4] = new Book(); 
    Scanner kb = new Scanner(System.in); 
    for (int i = 0; i< novel.length;) 
    { 
     System.out.println("Please Enter the books title"); 
     name = kb.nextLine(); 
     novel[i].setTitle(name); 
     System.out.println("Please enter the books author"); 
     author = kb.nextLine(); 
     novel[i].setAuthor(author); 
     System.out.println("Please enter the number of pages in this book"); 
     pages = kb.nextLine(); 
     novel[i].setPages(Integer.parseInt(pages)); 
     System.out.println(""+novel[i].title); 
     System.out.println(""+novel[i].author); 
     System.out.println(""+novel[i].getPages()); 
     ++i; 
    } 
    for (int x = 0; x<novel.length; x++) 
    { 
    System.out.print(""+ novel[x].title + "\n" + novel[x].author + "\n" + novel[x].pages); 
    } 

Прочитайте номер страницы как nextLine, вместо целого числа.

+0

Спасибо, ваш ответ был тем, который я реализовал. Я благодарю всех, кто тоже помогал. –

+0

приветствия @StevenAyerst !!! – UVM

2

Позвольте мне угадать, вы набираете что-то вроде «13 <enter>» на количество страниц, не так ли?

Вы используете программу неправильно. Не нажимайте enter после количества страниц в книге. Немедленно введите название следующей книги без пробелов или чего-либо еще. Код читает целое число, а затем читает строку для заголовка. Поэтому вы не можете поставить что-нибудь между целым числом и заголовком, так как это не то, что ожидал код.

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

Простое исправление: после kb.nextInt позвоните kb.nextLine и выбросьте пустую строку.

1

Эта линия:

name = kb.nextLine(); 

читает столько символов, сколько он может до тех пор, пока не найдет новый символ строки, а затем считывает этот символ, а также. Если эта строка:

pages = kb.nextInt(); 

читает в последовательности символов количества, но оставляет новый символ линии незатронутым.

В следующий раз, когда вы проходите через цикл, появляется новый символ линии, который не читается. Таким образом, kb.nextLine() покорно читает этот символ (даже если перед ним нет символов) и продолжается.

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

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