【问题标题】:java: double cannot be dereferencedjava: double 不能被取消引用
【发布时间】:2021-09-06 21:49:37
【问题描述】:

这是作业:

实现一个类 Car。一个 Car 对象应该有三个(私有)实例变量,一个用于燃油效率(代表每加仑英里数),一个用于燃油水平(代表加仑),以及一个用作里程表的变量(代表英里数)。汽车的燃油效率应在 Car 构造函数中指定为参数,并且构造函数应将燃油油位和里程表设置为零。还应该有第二个 Car 构造函数,它具有初始化燃油效率和燃油水平的两个参数(并且构造函数应该将里程表设置为零)。应该有 getFuelEfficiency()、getOdometer() 和 getFuelLevel() 方法。应该有一个方法 addFuel(double gallons) 将指定量添加到燃料水平,然后返回对当前 Car 对象的引用。应该有一个方法 drive(double miles) 来模拟驾驶汽车指定的距离。 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;
    }
}

这是我应该用来测试我的代码并且不应该更改的 PreTestDrive:

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.");
   }
}

当我运行 PreTestDrive 时,我收到错误 java: double cannot be dereferenced。有什么想法吗?

【问题讨论】:

  • 您的addFuel 方法没有返回指令所说的应该返回的内容。
  • 正如 khelwood 所指出的,这是因为您的方法返回一个双精度,而不是对象引用:car1.addFuel(12.5).getFuelLevel();
  • 您的代码需要大量工作。您创建 Car1,然后设置 1 个值。然后你读回 3 个值(其中 2 个是空的)。然后调用 IF 语句,由于 2 个值未设置,您的程序将在 100% 的时间内停止。

标签: java class method-chaining


【解决方案1】:

应该有一个方法 addFuel(double gallons) 将指定量添加到燃料水平,然后返回对当前 Car 对象的引用。

您的 addFuel 方法不返回对当前 Car 对象的引用。

看起来像这样:

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

另外,您没有在 Car(double fuelEfficiency) 构造函数中设置 fuelEfficiency 字段。

【讨论】:

  • 我在发布它 3 分钟后才发现它,但非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 2020-06-08
  • 2013-10-07
  • 2022-01-17
相关资源
最近更新 更多