1

私はで取得してNullPointerExceptionいます:

If(bookingList.size() == 0)

bookingList.add(vehicleBooking) 

bookingList.add(rvBooking) 

そして、何が原因なのかわかりません。どんな助けでも大歓迎です。

スタックトレース

bookingSystem.FerryBookingSystem at localhost:59034 
    Thread [main] (Suspended (exception NullPointerException))  
        FerryBookingSystem.bookingIDExists(String) line: 35 
        FerryBookingSystem.addVehicleBooking() line: 49 
        FerryBookingSystem.main(String[]) line: 114 
C:\Program Files\Java\jre7\bin\javaw.exe (14/05/2013 10:52:02 PM)

予約例外

    package bookingSystem;

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

    class BookingException extends Exception{
       String message;
       String IDs;

       public BookingException(String message){
          this.message = message;
       }
       public BookingException(String message, String IDs){
          this.message = message;
          this.IDs = IDs;
       }
       public String getIDs(){
          return IDs;
       }
       public String getMessage(){
          return message;
       }
    }

フェリー予約システム

    public class FerryBookingSystem {
    private static ArrayList<VehicleBooking> bookingList;
    private static Scanner userInput = new Scanner (System.in);

    public FerryBookingSystem(){
        bookingList = new ArrayList<VehicleBooking>();
    }

    public static int bookingIDExists(String IDs){
       if (bookingList.size() == 0)
             return -1;
          for (int i = 0; i < bookingList.size(); i++){
             if(bookingList.get(i).getbookingID().equals(IDs))
                return i;
          }
          return -1;
       } 


    public static boolean addVehicleBooking(){
        System.out.print("Please enter the booking ID: ");
        String booking_ID = userInput.nextLine();

        if(bookingIDExists(booking_ID) != 1)
      {        
         System.out.println("\nError - Sale ID \"" + booking_ID + 
               "\" already exists in the system!");
         return false;
      }

        System.out.print("Please enter the registration number for the vehicle: ");
        String registration_Number = userInput.nextLine();
        System.out.print("Please enter the vehicle " +
                "description: ");
        String vehicle_Description = userInput.nextLine();
        System.out.print("Please enter the number of people travelling in the vehicle: ");
        int travelling_Number = userInput.nextInt();
        userInput.nextLine();
        VehicleBooking vehicleBooking = new VehicleBooking(booking_ID, registration_Number, vehicle_Description, travelling_Number);
        bookingList.add(vehicleBooking);
        System.out.println("New vehicle booking added successfully for " + booking_ID);
        return true;
    }

    public static boolean addRecreationalVehicleBooking(){
       System.out.print("Please enter the booking ID: ");
       String booking_ID = userInput.nextLine();

       System.out.print("Please enter the registration number for the vehicle: ");
       String registration_Number = userInput.nextLine();
       System.out.print("Please enter the vehicl description: ");
       String vehicle_Description = userInput.nextLine();
       System.out.print("Please enter the number of people travelling in the vehicle: ");
       int travelling_Number = userInput.nextInt();
       userInput.nextLine();
       RVBooking rvBooking = new RVBooking(booking_ID, registration_Number, vehicle_Description, travelling_Number);
       bookingList.add(rvBooking);
       System.out.println("New rvbooking added successfully for " + booking_ID);
       return true;
    }

    public static void displayBookingSummary(){
       if (bookingList.size() != 0){
          System.out.println("\nSummary of all past vehicle booking stored on system.");
          for (int i=0 ; i<bookingList.size() ; i++){
             bookingList.get(i).printBookingSummary();
             System.out.println("");
          }
       }
    }

    public static void main (String [] args) throws IOException{
        char user;
        do{
        System.out.println("**** Ferry Ticketing System ****");
        System.out.println(" A   -   Add Vehicle Booking");
        System.out.println(" B   -   Add Recreational Vehicle Booking");
        System.out.println(" C   -   Display Booking Summary");
        System.out.println(" D   -   Update Insurance Status");
        System.out.println(" E   -   Record Recreational Vehicle Weight");
        System.out.println(" F   -   Compile Vehicle Manifest");
        System.out.println(" X   -   Exit");
        System.out.print("Enter your selection: ");
        String choice = userInput.nextLine().toUpperCase();
        user = choice.length() > 0 ? choice.charAt(0) : '\n';
        if (choice.trim().toString().length()!=0){
        switch (user){
            case 'A':
                addVehicleBooking();
                break;
            case 'B':
               addRecreationalVehicleBooking();
                break;
            case 'C':
               displayBookingSummary();
                break;
            case 'D':
                break;
            case 'E':
                break;
            case 'F':
                break;
            case 'X':
                break;
            default:
                break;
                }
        }
        }while(user!='X');
    }
}
4

5 に答える 5

2

あなたのコード:

private static ArrayList<VehicleBooking> bookingList;

初期化されていません。というわけで初期化。

于 2013-05-14T12:56:56.067 に答える
2

bookingList は FerryBookingSystem の静的属性です。

コンストラクターで初期化しますが、これは静的属性には意味がありません。

次に、FerryBookingSystem をインスタンス化しないため、コンストラクターを呼び出すことはありません。

編集:

コードを詳しく調べたところ、最初に bookingList を static として宣言し、次にコンパイルの問題を解決するためにすべてのメソッドを static としてマークしたようです...

この属性を静的にする必要はないと思うので、属性とすべてのメソッドの静的キーワークを削除してください。

public class FerryBookingSystem {
    private ArrayList<VehicleBooking> bookingList;

次に、メイン メソッドの先頭で FerryBookingSystem をインスタンス化します。

public static void main (String [] args) throws IOException{
    char user;
    FerryBookingSystem fbs=new FerryBookingSystem();

そして、このインスタンスのメソッドを呼び出します:

    switch (user){
        case 'A':
            fbs.addVehicleBooking();
            break;
        case 'B':
           fbs.addRecreationalVehicleBooking();
            break;
        case 'C':
           fbs.displayBookingSummary();
于 2013-05-14T12:57:18.847 に答える
0

bookingListの初期化を通常のコンストラクターから静的初期化ブロックに移動します。

static {
    bookingList = new ArrayList<VehicleBooking>();
}

または宣言の時点で初期化します。

private static ArrayList<VehicleBooking> bookingList = new ArrayList<VehicleBooking>();

それ以外の場合は、のコンストラクターの最初の呼び出しが行われるまでbookingList残ります。nullFerryBookingSystem

于 2013-05-14T12:56:37.070 に答える
0

コンストラクターで静的フィールドを初期化し、静的メソッドで使用します。これで、そのクラスのインスタンスを作成しなくても、これらのメソッドを呼び出すことができます。bookingList

bookingListそのため、メソッドを呼び出した時点で初期化されていない可能性が高くなります。すべての静的修飾子を削除するか、フィールドを直接初期化してコンストラクターを削除してください。

(すべての static 修飾子を削除し、クラスのインスタンスを使用することをお勧めします)

于 2013-05-14T12:57:54.367 に答える
0

コンストラクターで静的変数を初期化しないでください。static は、そのクラスのインスタンスが作成される前でも呼び出すことができます。

あなたの場合、 bookingListは静的であり、このクラスのオブジェクトを作成せずに呼び出すことができます。これが NullPonterException の理由です。

于 2013-05-14T13:03:06.763 に答える