Нужен свежий взгляд с моим Java-кодом - PullRequest
0 голосов
/ 02 января 2019

Я надеюсь, что сообщество может предоставить мне свежий взгляд, так как я немного заболел кодом,

Я прикрепил свой код от обоих классов, которые мне нужно соединить вместе дляУчебник Удеми.

Когда я их компилировал, возникали обычные ошибки, неправильно записанные переменные и пропущенные точки с запятой.Это также вызвало неожиданный тип, который был решен путем замены int на String.

Проблема, с которой я столкнулся, находится в строке 25, ошибка, которую он мне дает, является

несовместимойтипы, здесь требуется выражение определенного типа.Вы предоставили выражение другого типа, которое не совместимо.(например, вы написали строку, где ожидалось int.)

Но вызываемая переменная объявляется строкой, насколько я вижу во всех случаях.

Я написал это в intelliJ и использовал его для генерации методов получения / установки, так что все они должны быть правильными, и я просто не могу на всю жизнь понять, откуда исходит ошибка.

Я знаю, что это будет что-то простое, но просто не вижу леса за деревьями.

Класс автомобиля.

public class Car
{
   // instance variables
   private int numOfMilesDone; // a car has-a number of miles drive, "20000"
   private int yearBought; // a car has-a year it was bought "1997"
   private int carValue;  // a car has-a value of what it is worth "300"
   private Model modelName; // a car has-an model of type Model

   /**
    * Constructor for objects of class Car
    */

   public Car(int aNumMiles, int aYearBought, int aValue, Model aModelName)
   {
      this.numOfMilesDone = aNumMiles;
      this.yearBought = aYearBought;
      this.carValue = aValue;
      this.modelName = aModelName;
   }

   public Model getModelName()
   {
      if (this.modelName == null || this.getModelName() == null )
      {
         return ("needs to be checked");
      }

      return modelName;
   }

   /**
    * Getter method for number of miles the car has done
    * @return
    */

   public int getNumOfMilesDone()
   {
      return numOfMilesDone;
   }

   /**
    * Setter method for number of miles the car has done
    * @return
    */

   public void setNumOfMilesDone(int numOfMilesDone)
   {
      this.numOfMilesDone = numOfMilesDone;
   }

   /**
    * Getter method for the year the car was bought
    * @return
    */

   public int getYearBought()
   {
      if (this.yearBought == null)
      {
         return "Needs to be checked";
      }

      return yearBought;
   }

   /**
    * Setter method for the year the car was bought
    * @return
    */

   public void setYearBought(int yearBought)
   {
      this.yearBought = yearBought;
   }

   /**
    * Getter method for the year the cars value in pounds
    * @return
    */

   public int getCarValue()
   {
      return carValue;
   }

   /**
    * Setter method for the year the cars value in pounds
    * @return
    */

   public void setCarValue(int carValue) {
      this.carValue = carValue;
   }

   public boolean isClassic()
   {
      return(Integer.parseInt(this.modelName.getYearOfModel()) < 1969);
   }

   /**
    * returns the a String describing the object
    * @return
    */

   public String toSting()
   {
      return this.getModelName() + " has done " + this.numOfMilesDone + ", it is worth " + this.carValue + ", it is " 
              + this.isClassic() + " it's a classic.";
   }

}

Мой другой класс, Модель, этобез проблем компилируется.

public class Model
{
    private String modelName; // the model has a model name
    private String yearOfModel; // the year the model was created


    /**
     * constructor method for no model attributes
     */

    public Model()
    {
        this.modelName = null;
        this.yearOfModel = null;
    }


    /**
     * constructor method for known modelName attribute, but no yearOfModel attribute
     * @param bModelName
     */

    public Model(String bModelName)
    {
        this.modelName = bModelName;
        this.yearOfModel = null;
    }

    /**
     * constructor method for known modelName attribute, and known yearOfModel attribute
     * @param bModelName
     * @param yearOfModel
     */

    public Model(String bModelName, String yearOfModel)
    {
        this.modelName = bModelName;
        this.yearOfModel = yearOfModel;
    }

    /**
     * modelName getter method
     * @return
     */

    public String getModelName() {
        return modelName;
    }

    /**
     * modelName setter method
     * @param modelName
     */

    public void setModelName(String modelName) {
        this.modelName = modelName;
    }

    /**
     * yearOfModel setter method
     * @return
     */

    public String getYearOfModel() {
        return yearOfModel;
    }

    /**
     * yearOfModel setter method
     * @param yearOfModel
     */

    public void setYearOfModel(String yearOfModel) {
        this.yearOfModel = yearOfModel;
    }

    /**
     * returns the modelName and yearOfModel variables as comprehensible information.
     * @return
     */

    public String toString()
    {
        return this.modelName + " was launched in " + this.yearOfModel;
    }
}

Заранее спасибо за помощь.

Ответы [ 5 ]

0 голосов
/ 02 января 2019

У вас есть проблема, потому что вы используете стиль C like, когда возвращаемое значение используется для обнаружения проблемы.В данном случае вы не можете использовать его, поскольку тип возвращаемого значения и сообщение об ошибке строки не совпадают (например, String.indexOf() возвращает либо позицию, либо -1, если не найден).

В вашей ситуации лучшебросьте NullPointerException с сообщением.

public Model getModelName() {
    Objects.requireNonNull(modelName, "needs to be checked");
    return modelName;
}

public int getYearBought() {
    Objects.requireNonNull(yearBought, "Needs to be checked");
    return yearBought;
}

Это не ответ на ваш вопрос, но я думаю, что у вас есть другая проблема с вашим кодом.Ниже несколько комментариев.

// it's better to check value when set it, but not when get (class instance should always contains correct value, this is plain old dto)
// do hot use useless JavaDoc: make code self documented
class Car {

    private int numOfMilesDone; // a car has-a number of miles drive, "20000"
    private int yearBought; // a car has-a year it was bought "1997"
    private int value;  // a car has-a value of what it is worth "300"
    private final Model model; // a car has-an model of type Model

    // the name of method's parameters and local ones usually the same (use this for local ones)
    public Car(int numOfMilesDone, int yearBought, int value, Model model) {
        setNumOfMilesDone(numOfMilesDone);
        setYearBought(yearBought);
        setValue(value);
        // use null object instead of null
        this.model = model != null ? model : Model.NULL;
    }

    public Model getModel() {
        return model;
    }

    public int getNumOfMilesDone() {
        return numOfMilesDone;
    }

    public void setNumOfMilesDone(int numOfMilesDone) {
        this.numOfMilesDone = Math.max(0, numOfMilesDone);
    }

    public int getYearBought() {
        return yearBought;
    }

    public void setYearBought(int yearBought) {
        this.yearBought = Math.max(0, yearBought);
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return model + " has been done " + numOfMilesDone + ", it is worth " + value + ", it is " + model.isClassic() + " it's a classic.";
    }
}

// you retrieve instance from `Car` class. It is better to make `Model` immutable and do not worry about encapsulation
final class Model {

    public static final Model NULL = new Model(null, null);

    // no need to use `Mode` in the name of internal properties
    private final String name;
    // usually this is integer, not a string
    private final int year;

    public Model(String name) {
        this(name, 0);
    }

    public Model(String name, int year) {
        this.name = name;
        this.year = Math.max(0, year);
    }

    public String getName() {
        return name;
    }

    public int getYear() {
        return year;
    }

    // this method belongs to the Model, but not to a Car
    public boolean isClassic() {
        return this != NULL && year < 1969;
    }

    @Override
    public String toString() {
        return name + " was launched in " + year;
    }
}
0 голосов
/ 02 января 2019

Есть пара неправильных вещей, которые выскочили:

У вас есть ошибки как минимум в двух местах:

В getModelName() у вас есть две проблемы:

1) Вы намереваетесь вернуть Model, но вместо этого в случаях ошибки вернуть String.

2) Вы делаете рекурсивный вызов getModelName() без условия завершения.

 public Model getModelName()
 {
  if (this.modelName == null || this.getModelName() == null )
  {
     // NOTE: This is a String!
     return ("needs to be checked");
  }

  return modelName;
 }

Это можно переписать так:

public Model getModelName() {
    return modelName;
}

Возвращается ноль, если modelName равно нулю, и ненулевое Model в противном случае.

Также в getYearBought(), вы делаете то же самое - возвращайте String, когда вы намереваетесь вернуть int.

public int getYearBought () {if (this.yearBought == null) {// ПРИМЕЧАНИЕ. Возвращает String return "Необходимо проверить";}

  return yearBought;

}

Проверка того, что yearBought является нулевым, не требуется, это int и оно не может быть нулевым.Вы можете переписать это так:

public int getYearBought() {
    return yearBought;
}
0 голосов
/ 02 января 2019

Вам нужно исправить два метода getYearBought() и getModelName().Обе они возвращают строки, тогда как getYearBought() ожидает, что будет возвращено int, и getModelName() ожидает, что объект класса Model будет возвращен

.
0 голосов
/ 02 января 2019

Я вижу несколько проблем.Ваш метод getModelName() вызывает себя this.getModelName()

Также он возвращает класс Model и modelName имеет тип Model.Но тогда в вашем операторе if вы возвращаете строку, а не класс Model

if (this.modelName == null || this.getModelName() == null ) {
    return ("needs to be checked"); // This needs to return a Model
}
0 голосов
/ 02 января 2019

return "Needs to be checked" вы возвращаете строку, когда подпись вашего метода предлагает ModelName.

...