2012-03-10 100 views
0

我的任務是爲大學創建一個小型應用程序,並創建了一個簡單的預訂系統。 我遇到了一個問題,當程序運行時,我無法理解它正在執行方法的打印部分,但隨後跳到下一個方法而不執行原始方法的in.next()部分。Java - 代碼跳過輸入

我已經在這裏列出了抽象類,發生問題的類,菜單和'創建'類。

我已經被告知在這之前我的編碼(至少命名約定)不是最好的,所以我提前爲此道歉。

當我改變了這個類,這不是raw_Booking的擴展,它似乎沒有這個問題,但不知道這是否相關。

import java.util.Scanner; 


abstract class raw_Booking { 


private static String fname; 
private static String lname; 
private static int HouseNo; 
private static String Street; 
private static String Postcode; 


Scanner in = new Scanner(System.in); 


raw_Booking(){ 


} 

abstract public String Setfname(); 
abstract public String Setlname(); 
abstract public int SetHouseNo(); 
abstract public String SetStreet(); 
abstract public String SetPostcode(); 
abstract public String Verification(); 



} 

問題類(方法是SetPostcode):

import java.util.ArrayList; 
import java.util.Scanner; 

public class Booking_Creation{ 

static Scanner in = new Scanner(System.in);  

static ArrayList<Hotel_Booking> hotelbookings = new ArrayList<Hotel_Booking>(); 
static ArrayList<Flight_Booking> flightbookings = new ArrayList<Flight_Booking>(); 
static ArrayList<Car_Hire> carhirebookings = new ArrayList<Car_Hire>(); 
static ArrayList<Amusement_Park_Ticket> parkticket = new ArrayList<Amusement_Park_Ticket>(); 
static ArrayList<Concert_Ticket> concertticket = new ArrayList<Concert_Ticket>(); 



static int selection; 
public static void main(String[] arguments){ 

    Interface.Menu(); 

    selection = in.nextInt(); 

    // COULD ASK THE QUESTIONS HERE???? 
    /// BUT THE INPUT BIT IS INSIDE THE OTHER CLASS 



    switch(selection){ 
      case 1: 
      Hotel_Booking hb = new Hotel_Booking(); 
      hotelbookings.add(hb); 
      break; 
      case 2: 
      Flight_Booking fb = new Flight_Booking(); 
      flightbookings.add(fb); 
      break; 
      case 3: 
      Car_Hire ch = new Car_Hire(); 
      carhirebookings.add(ch); 
      break; 
      case 4: 
      Amusement_Park_Ticket pt = new Amusement_Park_Ticket(); 
      parkticket.add(pt); 
      break; 
      case 5: 
      Concert_Ticket ct = new Concert_Ticket(); 
      concertticket.add(ct); 
      break; 
     } 


} 
} 

輸出示例:

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

class Hotel_Booking extends raw_Booking{ 



Scanner in = new Scanner(System.in); 

private String TheVerification; 
private int guests; 
private String Roomtype; 
private double numbRooms; 
private double costStay; 
private double nights; 
private static String fname; 
private static String lname; 
private static int HouseNo; 
private static String Street; 
private static String Postcode; 

Hotel_Booking() { 

    fname = Setfname(); 
    lname = Setlname(); 
    HouseNo = SetHouseNo(); 
    Street = SetStreet(); 
    Postcode = SetPostcode(); 
    TheVerification = Verification(); 
    Roomtype = setRoomtype(); 
    guests = guests(); 
    numbRooms = numbRooms(); 
    nights = nights(); 
    costStay = costStay(); 
    Write_File(); 
} 


public String Setfname(){ 
    System.out.println(); 
    System.out.print("Bookers first name please: "); 
    fname = in.next(); 
    return fname; 
} 

public String Setlname(){ 

    System.out.println(); 
    System.out.print("Bookers surname please: "); 
    lname = in.next(); 
    return lname; 
} 

public int SetHouseNo(){ 
    Scanner sc = new Scanner(System.in); 
    System.out.println(); 
    System.out.print("Please enter your house number: "); 
    while (!sc.hasNextInt()) { 
     System.out.println(); 
     System.out.print("You need to enter a number - please re-enter: "); 
     sc.next(); 
    } 
return sc.nextInt(); 
} 


public String SetStreet(){ 
    System.out.println(); 
    System.out.print("Please enter your street: "); 
    Street =in.next(); 
    return Street; 
} 

public String SetPostcode(){ 

    System.out.println(); 
    System.out.print("Please enter your postcode: "); 
    Postcode = in.next(); 
    return Postcode; 
} 


public String Verification(){ 

    System.out.println(); 
    System.out.print("Please provide your car reg as verification: "); 
    TheVerification = in.next(); 
    return TheVerification; 

} 

public String setRoomtype(){ 

    System.out.println(); 
    System.out.print("Would you like a Premiun or Regular room(s)? "); 
    Roomtype = in.next(); 
    return Roomtype; 
} 

public int guests(){ 

    System.out.println(); 
    System.out.print("How many guests will be staying? "); 
    guests = in.nextInt(); 
    return guests; 

} 
//For every 3 guests their must be 1 room at £50 per night. 
//Premiun rooms = price doubled 

public double numbRooms(){ 

    for(int i=0;i < guests;i++){ 
     numbRooms = numbRooms+1; 
     i = i + 2; 
    } 
    System.out.println(); 
    System.out.println("You will require " + numbRooms + " number of rooms"); 
    return numbRooms; 
} 

public double nights(){ 

    System.out.println(); 
    System.out.print("How many nights are you staying? "); 
    nights = in.nextDouble(); 
    return nights; 
} 

public double costStay(){ 

    if(Roomtype.equals("Regular")){ 
     costStay = (nights * numbRooms)*50; 
    } 
    else{ 
     costStay = (nights * numbRooms)*100; 
    } 
    System.out.println(); 
    System.out.println("The total cost of your stay will be: " + costStay); 
    return costStay; 
} 

public void Write_File(){ 
    System.out.println(); 
    System.out.println("Your details will now be written to file."); 
    System.out.println(); 
    try{ 
     PrintWriter wr = new PrintWriter(new FileOutputStream("Hotel_Booking.txt",true)); 
     wr.println("Name: " + fname+ " " + lname); 
     wr.println("Address line one: " + HouseNo + " " + Street); 
     wr.println("Postcode: " + Postcode); 
     wr.println("Roomtype: " + Roomtype); 
     wr.println("Number of rooms: " + numbRooms); 
     wr.println("Nights staying: " + nights); 
     wr.println("Total cost of stay: " + costStay); 
     wr.close(); 
     } 

    catch (IOException e){ 
     System.out.println("Error -- " + e.toString()); 
     } 

} 
public static String Getfname(){ 
    return fname; 
} 

} 

包含接口/菜單..

public class Interface{ 



public static void Menu(){ 

    System.out.println("Welcome to the booking system select an option"); 
    System.out.println("1 - Create a new hotel booking"); 
    System.out.println("2 - Create a new airline booking"); 
    System.out.println("3 - Create a car hire booking"); 
    System.out.println("4 - Create a amusement park ticket booking"); 
    System.out.println("5 - Create a concert ticket booking"); 
    System.out.println(); 




} 

} 

執行的主要點:

Welcome to the booking system select an option 
1 - Create a new hotel booking 
2 - Create a new airline booking 
3 - Create a car hire booking 
4 - Create a amusement park ticket booking 
5 - Create a concert ticket booking 

1 

Bookers first name please: Herton 

Bookers surname please: Ferford 

Please enter your house number: 4 

Please enter your street: Park Lane 

Please enter your postcode: 
Please provide your car reg as verification: KS23 

提前問候。

+0

考慮創建一個[SSCCE](http://sscce.org)。 – Jeffrey 2012-03-10 20:18:57

+1

@Herten爲你的代碼提供了一些註釋。你的延伸並沒有太大的作用。沒有必要在Hotel Booking類中複製變量(fname,lname等)。當你擴展你可以訪問這些變量。也不要讓它們變成靜態的。如果它們是靜態的,那意味着內存中只存在一個副本。所以,如果你想做5個酒店預訂,他們都將具有相同的價值。 – Sean 2012-03-10 20:44:44

回答

1

快速瀏覽一下你的樣本執行後,我認爲街道名稱被解析爲兩個標記,所以街道名稱被設置爲「Tulloch」,當提示輸入郵編(作爲字符串),「Park」被閱讀。 在Scanner.next()方法上設置一個模式以強制全行作爲單個標記可能很有用?

+0

非常感謝你 - 正是這個問題。 – 2012-03-10 20:26:54

+0

或僅使用scanner類中的nextLine()。無需在下一個方法上使用Pattern來實現相同的目的。 – Sean 2012-03-10 20:42:23