Простой выходной вопрос

1

Поэтому в моем классе мы делаем простые программы, и мы вводим наследование. Я получил все, чтобы работать правильно, но я не могу заставить этот бит вывода работать правильно. Это когда я прошу ввода, но он пропускает один из моих входов и переходит к запросу для второго. Когда я прокомментирую все другие вещи, прежде чем это не понадобится, он не пропустит первый вход. Я не понимаю, почему это так, и если кто-то может помочь мне понять, почему это было бы очень полезно. Спасибо заранее, и вот мои два класса, за которыми следует тестер:

Класс личности:

    public class Person{
    private String name, address, phoneNumber;
    public Person(){
        name="none";
        address="none";
        phoneNumber="none";
    }
    public Person(String inName, String inAddress, String inPhoneNumber){
        name=inName;
        address=inAddress;
        phoneNumber=inPhoneNumber;
    }
    public String getName(){
        return name;
    }
    public void setName(String newName){
        name = newName;
    }
    public String getAddress(){
        return address;
    }
    public void setAddress(String newAddress){
        address = newAddress;
    }
    public String getPhoneNumber(){
        return phoneNumber;
    }
    public void setPhoneNumber(String newPhoneNumber){
        phoneNumber = newPhoneNumber;
    }
    public String toString(){
        return String.format("Name: " + name + "\nAddress: " + address + "\nPhone Number: " + phoneNumber);
    }
    public void clearPerson(){
        name="none";
        address="none";
        phoneNumber="none";
    }
}

Класс клиента:

    public class Customer extends Person{
    private int customerNumber;
    private boolean mailingList;
    public Customer(){
        customerNumber=0;
        mailingList=false;
    }
    public Customer(int inCustomerNumber, boolean inMailingList){
        customerNumber=inCustomerNumber;
        mailingList=inMailingList;
    }
    public int getCustomerNumber(){
        return customerNumber;
    }
    public void setCustomerNumber(int newCustomerNumber){
        customerNumber=newCustomerNumber;
    }
    public boolean getMailingList(){
        return mailingList;
    }
    public void setMailingList(boolean newMailingList){
        mailingList=newMailingList;
    }
    public String toString(){
        return "Customer Number: "+customerNumber+"\nMailing List: "+mailingList+"\n";
    }
    public void clearCustomer(){
        customerNumber=0;
        mailingList=false;
    }
}

Класс тестера:

import java.util.*;
public class CustomerPersonTester{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        Person testP1 = new Person();
        Customer testC1 = new Customer();
        System.out.println("Empty paramaters constructed on Person and Customer. Results: ");
        System.out.println(testP1.toString());
        System.out.println(testC1.toString());
        /*System.out.println(testP1.getName());
        System.out.println(testP1.getAddress());
        System.out.println(testP1.getPhoneNumber());
        System.out.println(testC1.getCustomerNumber());
        System.out.println(testC1.getMailingList());*/
        System.out.println("Expected: none x3, 0, false.\n");
        System.out.print("Enter a new name: ");
        String newName = in.nextLine();
        System.out.print("Enter a new address: ");
        String newAddress = in.nextLine();
        System.out.print("Enter a new phone number: ");
        String newPhoneNumber = in.nextLine();
        System.out.print("Enter a new customer number: ");
        int newCustomerNumber = in.nextInt();
        System.out.print("Enter a new true/false for mailing list: ");
        boolean newMailingList = in.nextBoolean();
        testP1.setName(newName);
        testP1.setAddress(newAddress);
        testP1.setPhoneNumber(newPhoneNumber);
        testC1.setCustomerNumber(newCustomerNumber);
        testC1.setMailingList(newMailingList);
        System.out.println(testP1.toString());
        System.out.println(testC1.toString());
        /*System.out.println(testP1.getName());
        System.out.println(testP1.getAddress());
        System.out.println(testP1.getPhoneNumber());
        System.out.println(testC1.getCustomerNumber());
        System.out.println(testC1.getMailingList());*/
        System.out.println("Expected: given name/address/phone number/customer number/boolean.\n");
        testP1.clearPerson();
        testC1.clearCustomer();
        System.out.println("\nTest 1 Complete. Values are reset. Please continue.\n");
        System.out.print("Enter a name: ");
        String inName = in.nextLine();
        System.out.print("Enter an address: ");
        String inAddress = in.nextLine();
        System.out.print("Enter a phone number: ");
        String inPhoneNumber = in.nextLine();
        System.out.print("Enter a customer number: ");
        int inCustomerNumber = in.nextInt();
        System.out.print("Enter true/false for mailing list: ");
        boolean inMailingList = in.nextBoolean();
        Person testP2 = new Person(inName, inAddress, inPhoneNumber);
        Customer testC2 = new Customer(inCustomerNumber, inMailingList);
        System.out.println(testP2.toString());
        System.out.println(testC2.toString());
        /*System.out.println(testP2.getName());
        System.out.println(testP2.getAddress());
        System.out.println(testP2.getPhoneNumber());
        System.out.println(testC2.getCustomerNumber());
        System.out.println(testC2.getMailingList());*/
        System.out.println("Expected: given name/address/phone number/customer number/boolean.\n");
        System.out.println("Program complete. Terminating...");
        in.close();
    }
}

Мой вывод выглядит следующим образом:

Empty paramaters constructed on Person and Customer. Results: 
Name: none
Address: none
Phone Number: none
Customer Number: 0
Mailing List: false

Expected: none x3, 0, false.

Enter a new name: Bob
Enter a new address: 123 Happy Lane
Enter a new phone number: 123-456-7890
Enter a new customer number: 12
Enter a new true/false for mailing list: true
Name: Bob
Address: 123 Happy Lane
Phone Number: 123-456-7890
Customer Number: 12
Mailing List: true

Expected: given name/address/phone number/customer number/boolean.


Test 1 Complete. Values are reset. Please continue.

Enter a name: Enter an address: Problem starts here...
  • 0
    Это когда вы хотите узнать об отладке. Начните с нескольких простых операторов печати, чтобы почувствовать поток своего кода. Если этого не достаточно, продвигайтесь по нему с помощью отладчика. Я бы начал с того, чтобы сузить это все же.
  • 0
    Когда я комментирую все строки 6-41, он выводит отлично и позволяет мой ввод для имени на testP2. Если нет, он пропускает ввод для имени на testP2. Кроме того, мы ничего не узнали об отладке, поэтому я не уверен, как это сделать.
Показать ещё 4 комментария
Теги:
output
formatting

1 ответ

1
Лучший ответ

Вызов nextBoolean() не использует символ новой строки, который следует за вашим true или false вводом. В результате этот символ новой строки по-прежнему находится во входном буфере при следующем вызове nextLine(), который немедленно потребляет оставшийся символ новой строки, а затем переходит.

Чтобы получить ожидаемое поведение, просто добавьте еще один вызов nextLine() сразу после вызова nextBoolean(). Вы также должны заметить, что это произошло бы, если nextInt() был последним вызовом в этой последовательности.

Вы также можете подумать о том, чтобы поместить части этого кода в какую-то форму цикла (возможно while цикл while?), Чтобы у вас не было большой части дублированного кода.

  • 0
    Спасибо, что нашли это для меня. Я не знал о непотреблении символа новой строки. Теперь, когда я поместил это в новую строку, чтобы он потреблял, я свободен дома. Что касается цикла, теперь, когда я оглядываюсь на него, я набрал чертовски намного больше, чем мне было нужно, но я буду помнить об этом для моего следующего тестера. Нет смысла переписывать то, что уже чрезмерно написано LOL (только в этом случае, в противном случае, это действительно хорошая идея).
  • 0
    @MikeN Нет проблем, рад помочь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню