scanner nextLine()跳过并读取失败

时间:2017-01-17 14:08:57

标签: java string eclipse

实际上并不确定是什么错误,只是在第81行我的扫描对象被跳过然后程序继续没有明确尝试读取任何内容,想法是什么错? btw在eclipse工作

import java.util.*;

public class Hospital
{
//--- Instance Variables
private Patient patient;
private Scanner scan;
private double totalPrivateRoomCharges;
private double totalSemiPrivateRoomCharges;
private double totalWardRoomCharges;
private double totalTelephoneCharges;
private double totalTelevisionCharges;
private double totalReceipts;

//--- Constructors
public Hospital()
{
    scan = new Scanner(System.in);
    totalPrivateRoomCharges = 0;
    totalSemiPrivateRoomCharges = 0;
    totalWardRoomCharges = 0;
    totalTelephoneCharges = 0;
    totalTelevisionCharges = 0;
    totalReceipts = 0;

    mainMenu();
}

//--- Methods
public void mainMenu()
{
    int ans = 0;

    do
    {
        System.out.println("        Community Hospital");
        System.out.println();
        System.out.println("             Main Menu");
        System.out.println();
        System.out.println("1) Enter Patient Billing Information");
        System.out.println("2) Print Daily Summary Report");
        System.out.println("3) Exit");
        System.out.println();
        System.out.print("Selection: ");
        ans = scan.nextInt();
        System.out.println();
        if(ans == 1)
        {
           patientBillingInfo();
        }

        if(ans == 2)
        {
           printSummaryReport();
        }
    }
    while(ans != 3);

}

// precondition: none
// postcondition: displays a menu that allows the user to enter a patient's
//      billing info which includes the patient's name, the number of days the 
//      patient stayed in the hospital, and the type of room 
//     (private, semi-private, ward).
//    Once the patient info is retrieved a patient object is created and a
//      billing report is generated that includes the patient's name, length
//      of stay, and the charges incurred including the bill total.
//    The totals that are used to print the hospitals daily summary report
//      are updated.
public void patientBillingInfo()
{
    String name = "";
    int days = 0;
    String room = "";
    System.out.println("        Community Hospital");
    System.out.println();
    System.out.println("        Patient Billing Query");
    System.out.println();
    System.out.println("Enter Patient Name: ");

这里扫描对象似乎被完全跳过,根本没有读取,只是移动到下一行并继续。

    name = scan.nextLine(); //getting skiped
    System.out.println("Enter number of days in Hospital: ");
    days = scan.nextInt();
    System.out.println("Enter Room type(P, S, W): ");
    room = scan.next();
    System.out.println();
    System.out.println();
    if(!((room.equalsIgnoreCase("P")) || (room.equalsIgnoreCase("S")) || (room.equalsIgnoreCase("W"))))
    {
        System.out.println("Incorect room information");
        System.out.println("Please enter P, S, or W for room selection");
        System.out.println();
        patientBillingInfo();
    }
    else
    {
        if(room.equalsIgnoreCase("P"))
            totalPrivateRoomCharges += 1*days;
        if(room.equalsIgnoreCase("S"))
            totalSemiPrivateRoomCharges += 1*days;
        if(room.equalsIgnoreCase("W"))
            totalWardRoomCharges += 1*days;
        totalTelephoneCharges += 1*days;
        totalTelevisionCharges += 1*days;
        patient = new Patient(name, days,room);
    }

    System.out.println("        Community Hospital");
    System.out.println();
    System.out.println("    Patient Billing Statement");
    System.out.println();
    System.out.println("Patient's name: " + patient.getName());
    System.out.println("Number of days in Hospital: " + patient.getDays());
    System.out.println();
    System.out.println("Room charge       $ " + patient.getRoomCharge());
    System.out.println("Telephone charge  $ " + patient.getTelephoneCharge());
    System.out.println("Television charge $ " + patient.getTelevisionCharge());
    System.out.println();
    System.out.println("Total charge      $ " +patient.getTotalCharge());
    System.out.println();
    System.out.println();
    mainMenu();
}

// precondition: none
// postcondition: a summary report is printed that includes the daily total
//     room charges for each type of room, the daily total telephone charges,
//     and the daily total television charges. The report also includes the
//     total receipts for the day.
public void printSummaryReport()
{
    double tPRC = 225.0*totalPrivateRoomCharges;
    double tSPRC = 165.0*totalSemiPrivateRoomCharges;
    double tWRC = 95.0*totalWardRoomCharges;
    double tTpC = 1.75*totalTelephoneCharges;
    double tTvC = 3.50*totalTelevisionCharges;
    double tR = tPRC+tSPRC+tWRC+tTpC+tTvC;
    System.out.println("        Community Hospital");
    System.out.println();
    System.out.println("      Daily Billing Summary");
    System.out.println();
    System.out.println("Room Charges");
    System.out.println("  Private:            $" + tPRC);
    System.out.println("  Semi-Private:       $" + tSPRC);
    System.out.println("  Ward:               $" + tWRC);
    System.out.println("Telephone Charges:    $" + tTpC);
    System.out.println("Telvision Charges:    $" + tTvC);
    System.out.println();
    System.out.println("Total Receipts:       $" + tR);
    System.out.println();
}
}

编辑:所以我刚想到也许只是其余的代码可能会有用但不知道我为什么不早点考虑这个但是其余的

实际运行的课程

public class Administrator
{   
   public static void main(String[] args)
   {
      Hospital hospital = new Hospital();
   }
}

以及处理患者信息的课程

public class Patient
{
//--- Constants
public final double PRIVATE = 225.00;
public final double SEMI    = 165.00;
public final double WARD    = 95.00;
public final double TELEPHONE = 1.75;
public final double TELEVISION = 3.50;

//--- Instance Variables
private String name;
private String roomType;
private int days;
//--- Constructors
public Patient(String n, int d, String rT)
{
    name = n;
    days = d;
    roomType = rT;
}
//--- Methods

// precondition:  none
// postcondition: returns the patient name
public String getName()
{
    return name;
}

// precondition:  none
// postcondition: returns the length of stay in days
public int getDays()
{
    return days;
}

// precondition:  none
// postcondition: returns the room type ("P", "S", "W")
public String getRoomType()
{
    return roomType;
}

// precondition:  none
// postcondition: returns the room charge which is dependant upon
// the room type and the length of stay.
public double getRoomCharge()
{
    double charge = 0;

    if(getRoomType().equalsIgnoreCase("P"))
        charge = 225.00*getDays();
    if(getRoomType().equalsIgnoreCase("S"))
        charge = 165.00*getDays();
    if(getRoomType().equalsIgnoreCase("W"))
        charge = 95.00*getDays();
    return charge;
}

// precondition:  none
// postcondition: returns the telephone charge which is dependant upon
//    the length of stay
public double getTelephoneCharge()
{
    double charge = 1.75*getDays();
    return charge;
}

// precondition:  none
// postcondition: returns the television charge which is dependant upon
//    the length of stay
public double getTelevisionCharge()
{
   double charge = 3.50*getDays();
   return charge;
}

// precondition:  none
// postcondition: returns the total charge which is the sum
//    of the room charge, telephone charge, and television charge.
public double getTotalCharge()
{
    double charge = getRoomCharge()*getTelephoneCharge()+getTelevisionCharge();
    return charge;
}
}

真的不知道为什么我早点没有发生这种情况,但无论生活和工作是否正确

2 个答案:

答案 0 :(得分:0)

您只需扫描一行,然后将其解析为整数值的整数。

所以读取整数而不是

val=scan.nextInt()

你可以使用

String strVal = scan.nextLine();
try {
val = Integer.parseInt(strVal);
} catch (NumberFormatException e) {
    //maybe try again, or break the code ... or proceed as you wish.
}

这是因为nextInt()没有接受"输入"密钥考虑在内,当你在nextInt()之后按下输入时,int被读入期望nextInt()的变量和"返回"密钥被nextLine()接受,导致空行被读入变量。

答案 1 :(得分:0)

public void mainMenu()中,您需要在ans = scan.nextInt()之后添加 scan.nextLine(); ;为了清除输入缓冲区的其余部分。

ans = scan.nextInt();
scan.nextLine();    // <----- Add this line here