java: нельзя разыменовать double

#java #class #method-chaining

Вопрос:

Это и есть задание:

Реализуйте автомобиль класса. Объект автомобиля должен иметь три (частные) переменные экземпляра: одну для топливной экономичности (представляющую мили на галлон), одну для уровня топлива (представляющую галлоны) и переменную, которая действует как одометр (представляющий мили). Топливная экономичность автомобиля должна быть указана в качестве параметра в конструкторе автомобиля, и конструктор должен установить уровень топлива и одометр на ноль. Также должен быть второй конструктор автомобилей с двумя параметрами, которые инициализируют топливную экономичность и уровень топлива (и конструктор должен установить одометр на ноль). Должны быть методы getFuelEfficiency(), getOdometer () и getFuelLevel (). Должен быть метод addFuel(двойные галлоны), который добавляет указанное количество к уровню топлива, а затем возвращает ссылку на текущий объект автомобиля. Должен быть метод езды(двойные мили), который имитирует вождение автомобиля на заданное расстояние. Метод drive() должен регулировать уровень топлива по количеству использованного топлива, регулировать одометр по количеству пройденных миль, и он должен возвращать количество пройденных миль, которое может быть меньше указанного количества миль, если топлива недостаточно. Обратите внимание, что не существует методов setFuelEfficiency (), setOdometer () и setFuelLevel (). Поле топливной эффективности является неизменяемым; как только оно задано конструктором, оно не может быть изменено. Значение одометра следует изменять только во время вождения автомобиля, как в реальном автомобиле. Значение уровня топлива следует изменять только во время вождения автомобиля или путем добавления топлива. Вот краткое описание конструкторов и методов (общедоступный интерфейс) класса Car.

Это мой код:

 public class Car {
    private double fuelEfficiency;
    private double fuelLevel;
    private double odometer;

    public Car(double fuelEfficiency) {
        this.fuelLevel = 0.0;
        this.odometer = 0.0;
    }

    public Car(double fuelEfficiency, double fuelLevel) {
        this.fuelLevel = fuelLevel;
        this.fuelEfficiency = fuelEfficiency;
        this.odometer = 0.0;
    }

    public double getFuelEfficiency() {
        return this.fuelEfficiency;
    }

    public double getFuelLevel() {
        return this.fuelLevel;
    }

    public double getOdometer() {
        return this.odometer;
    }

    public double addFuel(double gallons) {
        this.fuelLevel = this.fuelLevel   gallons;
        return this.fuelLevel;
    }

    public double drive(double miles) {

        double distance = (this.fuelLevel * this.fuelEfficiency);

        if (distance > miles) {
            distance = miles;
        }

        this.fuelLevel = (fuelLevel - (distance / fuelEfficiency));
        this.odometer = odometer   distance;
        return distance;
    }
    public String toString(){
        return "MPG: "   this.fuelEfficiency   "miles: "   this.odometer   "fuel: "   this.fuelLevel;
    }
}
 

Это предварительный диск, который я должен использовать для тестирования своего кода, и его не следует изменять:

 public class PreTestDrive
{
   public static void main( String[] args )
   {
      Car car1 = new Car(25.5);

      double fuelEfficiency = car1.getFuelEfficiency();
      double fuelLevel = car1.getFuelLevel();
      double odometer = car1.getOdometer();

      if (fuelLevel != 0.0 || fuelEfficiency != 25.5 || odometer != 0.0)
      {
         System.out.println("1. There is a problem with your constructors.");
         System.exit(0);
      }

      Car car2 = new Car(10.0, 5.0);

      fuelEfficiency = car2.getFuelEfficiency();
      fuelLevel = car2.getFuelLevel();
      odometer = car2.getOdometer();

      if (fuelLevel != 5.0 || fuelEfficiency != 10.0 || odometer != 0.0)
      {
         System.out.println("2. There is a problem with your constructors.");
         System.exit(0);
      }

      String s1 = car1.toString();

      if (! s1.equals("Car: mpg = 25.5, miles = 0.0, fuel = 0.0.") )
      {
         System.out.println("3. There is a problem with your toString() method.");
         System.exit(0);
      }

      String s2 = car2.toString();

      if (! s2.equals("Car: mpg = 10.0, miles = 0.0, fuel = 5.0.") )
      {
         System.out.println("4. There is a problem with your toString() method.");
         System.exit(0);
      }

      double newFuelLevel = car1.addFuel(12.5).getFuelLevel();

      fuelEfficiency = car1.getFuelEfficiency();
      odometer = car1.getOdometer();

      if(newFuelLevel != 12.5 || fuelEfficiency != 25.5 || odometer != 0.0)
      {
         System.out.println("5. There is a problem with your addFuel method.");
         System.exit(0);
      }

      double distance = car1.drive(76.5);

      if (distance != 76.5 || ! car1.toString().equals("Car: mpg = 25.5, miles = 76.5, fuel = 9.5."))
      {
         System.out.println("6. There is a problem with your drive method.");
         System.exit(0);
      }

      distance = car1.drive(1000);

      if (distance != 242.25 || ! car1.toString().equals("Car: mpg = 25.5, miles = 318.75, fuel = 0.0."))
      {
         System.out.println("7. There is a problem with your drive method.");
         System.exit(0);
      }

      distance = car1.drive(1);

      if (distance != 0.0 || ! car1.toString().equals("Car: mpg = 25.5, miles = 318.75, fuel = 0.0."))
      {
         System.out.println("8. There is a problem with your drive method.");
         System.exit(0);
      }

      System.out.println("Your Car class passed all of these tests.");
   }
}
 

Когда я запускаю предварительный диск, я получаю сообщение об ошибке java: невозможно разыменовать double. Есть какие-нибудь идеи, что это может быть ?

Комментарии:

1. Ваш addFuel метод не возвращает то, что указано в инструкциях, которые он должен возвращать.

2. Как указывает хелвуд, это происходит потому, что ваш метод возвращает двойную, а не ссылку на объект: car1.addFuel(12.5).getFuelLevel();

3. Ваш код требует большой работы. Вы создаете Car1, а затем устанавливаете значение 1. Затем вы считываете обратно 3 значения (2 из которых пусты). Затем вызывается оператор IF, и ваша программа будет останавливаться в 100% случаев в результате того, что 2 значения не заданы.

Ответ №1:

Должен быть метод addFuel(двойные галлоны), который добавляет указанное количество к уровню топлива, а затем возвращает ссылку на текущий объект автомобиля.

Ваш addFuel метод не возвращает ссылку на текущий объект Car.

Это выглядело бы так:

 public Car addFuel(double gallons) {
    this.fuelLevel  = gallons;
    return this;
}
 

Кроме того, вы не задаете fuelEfficiency поле в своем Car(double fuelEfficiency) конструкторе.

Комментарии:

1. Я понял это буквально через 3 минуты после того, как опубликовал это, но большое спасибо!