-3

完成したプログラムだと思っていたところにたどり着きましたが、今ではjavaがこれを引っ張っています。

私が得るエラーは次のとおりです。

Exception in thread "main" java.lang.NullPointerException
    at hirecardemo.HireCar.isAvailable(HireCar.java:68)
    at hirecardemo.HireCarDemo.runSimulation(HireCarDemo.java:49)
    at hirecardemo.HireCarDemo.main(HireCarDemo.java:25)
Java Result: 1

メインクラス:

package hirecardemo;
import java.util.Random;

public class HireCarDemo {

    public static void main(String[] args) {
        HireCar car0 = new HireCar("Toyota", "AV77 FGJ", 6000, 12300, 41500);
        HireCar car1 = new HireCar("Mercedes", "DI99 FTZ", 6700, 7000, 91800);
        HireCar car2 = new HireCar("Toyota", "FG82 FTP", 25000, 12000, 72000);
        HireCar car3 = new HireCar("Vauxhall", "TW56 LTS", 10000, 11000, 19001);
        HireCar car4 = new HireCar("Ford", "TD85 LTU", 13000, 12300, 12000);
        HireCar car5 = new HireCar("Susuki", "GU12 UTJ", 12000, 10000, 50000);

        HireCar[] fleet = {car0, car1, car2, car3, car4, car5};
        int minMileage = 1000;
        int maxMileage = 60000;
        int numberOFevents = 12;

        String [] results = HireCarDemo.runSimulation(fleet, numberOFevents,
                minMileage, maxMileage);

        for(int i = 0; i < numberOFevents; i++) {
            System.out.println(results[i]);
        }
    }

    /**
    * @param fleet the fleet of hire cars
    * @param numberOFevents the size of the events table to be generated
    * @param minMileage the assumed minimum mileage driven by any hired
    * car
    * @param maxMileage the assumed maximum mileage driven by any hired
    * car
    * @return table of events generated during the simulation
    */
    public static String[] runSimulation(HireCar [] fleet, int numberOFevents, 
            int minMileage, int maxMileage) {
        int n = fleet.length; // Number of cars in the fleet.
        Random carGenerator = new Random();
        String [] events = new String [numberOFevents];
        for(int i = 0; i < numberOFevents; i++) {
            int randomNumber = carGenerator.nextInt(n-1);
            if(fleet[randomNumber].isAvailable() == true)
            {
                fleet[randomNumber].hireOut();
                events[i] = fleet[randomNumber].getRegNumber() + " <HIRE OUT>";
            }

            else if(fleet[randomNumber].isOnHire() == true)
            {
                Random mileage = new Random();
                int randomMileage = mileage.nextInt(maxMileage - minMileage); 

                if(fleet[randomNumber].isBeingServiced() == true)
                {
                    events[i] = fleet[randomNumber].getRegNumber() + 
                            " <RETURN FROM HIRE>" + " <SEND FOR SERVICE>";
                } else {
                    events[i] = fleet[randomNumber].getRegNumber() + 
                            " <RETURN FROM HIRE>";                    
                }
            }
            else 
            {
                fleet[randomNumber].makeAvailable();
                events[i] = fleet[randomNumber].getRegNumber() + 
                        " <RETURN FROM SERVICE>";
            }
        }
        return events;  
    }
}

これに伴う私の別のクラスは次のとおりです。

//******************************************************************************
// HireCar.java                                             Author: Ryan Holder
// 
// Represents the car hire company's fleet of cars and the information on them.
//******************************************************************************
package hirecardemo;


public class HireCar {

    private String manufacturer, regNumber, carStatus;
    private int mileage, serviceInterval, lastService; // All in miles.    

    private boolean serviceDue() { 
        if((mileage- lastService) >= serviceInterval) {
            this.sendForService();  
            return true;
        } else { 
            return false;
        }
    }

   private void sendForService() {
       carStatus = "Servicing";      
   }

    //--------------------------------------------------------------------------
    // Default Constructor: Sets information for a new car.
    //--------------------------------------------------------------------------    
    public HireCar(String demoManufacturer, String demoRegNumber) {
        manufacturer = demoManufacturer;
        regNumber = demoRegNumber;
        carStatus = "Available";
        serviceInterval = 0;        
        lastService = 0;
        mileage = 0;                 
    }  

      public HireCar(String demoManufacturer, String demoRegNumber, 
             int demoMileage, int demoServiceInterval, int lastInterval) { 
         manufacturer = demoManufacturer;
         regNumber = demoRegNumber;
         mileage = demoMileage;     
     }

    public void setMileage(int demoMileage) {
        mileage = demoMileage;
    }    

    public void setServiceInterval(int demoServiceInterval) {
        serviceInterval = demoServiceInterval;
    }

    public void setLastService(int demoLastService) {
        lastService = demoLastService;    
    }

    public String getRegNumber() {
        return regNumber;
    }

    public void makeAvailable() {
        carStatus = "Available";
    }


    public boolean isAvailable() {
        if(carStatus.equals("Available") || carStatus.equals("Return from Service")) {
            return true;
        } else {
            return false;
        }
    }

    public boolean isOnHire() {
        if(carStatus.equals("On Hire")) {
            return true;
        } else {
            return false;
        }
    }


    public boolean isBeingServiced() {
        if(carStatus.equals("Being Serviced")) {
            return true;
        } else {
            return false;
        }
    }


 public void hireOut() {
        carStatus = "On Hire"; 
    }

    public void returnFromHire() {
        if(this.serviceDue() == true) {
            carStatus = "Being Serviced";            
        } else {
            carStatus = "Available For Hire";
        }        
    }

    public void returnFromService() {
        carStatus = "Return From Service";
    }

    public String ToString() {
        return("Manufacturer: <" + this.manufacturer + ">/n "
                + "Registration Number: <" + this.regNumber + ">/n" 
                + "Mileage: <" + this.mileage + ">/n" 
                + "Service Interval: <" + this.serviceInterval + "</n"
                + "Last Service: <" + this.lastService + "</n"
                + "Status: <" + this.carStatus + "</n");
    }
}
4

4 に答える 4

2

5-arg constructorインスタンスの構築に使用していHireCarます:-

new HireCar("Toyota", "AV77 FGJ", 6000, 12300, 41500);

そして、そのコンストラクターでは、-の値を設定していません"carStatus"

 public HireCar(String demoManufacturer, String demoRegNumber, 
         int demoMileage, int demoServiceInterval, int lastInterval) { 
     manufacturer = demoManufacturer;
     regNumber = demoRegNumber;
     mileage = demoMileage;     
 }

だから、carStatusまだnullです。(このコンストラクターのすべてのフィールドを設定する必要があります。デフォルト値は)referencesであるため、少なくとも。null

したがって、isAvailable追加したインスタンスのいずれかのメソッドを呼び出すと、array:-

fleet[randomNumber].isAvailable() 

これにより、メソッドの場合NPEと同様に、次のisAvailableメソッドが呼び出さequalscarStatusます:-

if(carStatus.equals("Available") || carStatus.equals("Return from Service"))
     ^^^
 This is null here
于 2012-12-03T22:17:58.547 に答える
1

スタックトレースは、isAvailableメソッドがNullPointerExceptionをスローしていることを示しているので、それを見てみましょう。

public boolean isAvailable() {
    if(carStatus.equals("Available") || carStatus.equals("Return from Service")) {
        return true;
    } else {
        return false;
    }
}

不必要にtrue/falseを返すことはさておき、ここで逆参照されるのは車のステータスだけです。それで、いつnullになることができますか?

さて、あなたが使用しているコンストラクターを見てください:5つの引数を持つもの。ステータスを設定することは決してないため、nullのままになります。したがって、nullポインタ。

于 2012-12-03T22:18:36.490 に答える
0

2引数のコンストラクターで初期化 してcarStatusいて、そのコンストラクターを呼び出すことはないため、メソッドcarStatusを呼び出してもnullのままです。      equals()isAvailable()

  if(carStatus.equals( "Available")|| carStatus.equals( "Return from Service")){

   ^^^ This is **null** as it is not initialized yet, Thus **NPE**.

carStatusまた、現在のコードが機能するように、5引数のコンストラクターを順番に初期化する必要があります。

 public HireCar(String demoManufacturer, String demoRegNumber, 
             int demoMileage, int demoServiceInterval, int lastInterval) { 
         manufacturer = demoManufacturer;
         regNumber = demoRegNumber;
         mileage = demoMileage;     
         carStatus="someval" ; //initialize carStatus here
     }
于 2012-12-03T22:17:56.483 に答える
0
  1. carStatusの文字列の代わりに列挙型を使用する
  2. ALLコンストラクターのすべての属性を初期化します(左から2番目のcarStatus = null)
于 2012-12-03T22:18:19.017 に答える