Ошибка переполнения стека при вызове метода toString - PullRequest
0 голосов
/ 13 июля 2020

это мой код, но когда я запускаю программу, я получаю много ошибок и не знаю почему. Может ли кто-нибудь мне помочь?

RegisteredUser. java

public class RegisteredUser {
    private String nickname;
    ArrayList<ReviewDAO> reviews;

    public RegisteredUser(String nickname) {
        this.nickname = nickname;
        reviews = new ArrayList<>();
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public void addReview(ReviewDAO review) {
        if (!this.reviews.contains(review)) {
            this.reviews.add(review);
            review.addRegisteredUser(this);
        }
    }

    @Override
    public String toString() {
        return "RegisteredUser{" +
                "nickname='" + nickname + '\'' +
                ", reviews=" + reviews +
                '}';
    }
}

ReviewDAO. java

public abstract class ReviewDAO {
    RegisteredUser registeredUser;

    public abstract boolean write(Review review);

    public void addRegisteredUser(RegisteredUser registeredUser) {
        this.registeredUser = registeredUser;
    }

    @Override
    public String toString() {
        return "ReviewDAO{" +
                "registeredUser=" + registeredUser +
                '}';
    }
}

Обзор. java

public class Review {
    private String title;
    private String description;
    private int rank;
    private boolean isAnonymous;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public int getRank() {
        return rank;
    }

    public void setRank(int rank) {
        this.rank = rank;
    }

    public boolean isAnonymous() {
        return isAnonymous;
    }

    public void setAnonymous(boolean anonymous) {
        isAnonymous = anonymous;
    }
}

ОбзорDAO_MongoDB. java

public class ReviewDAO_MongoDB extends ReviewDAO {
    @Override
    public boolean write(Review review) {
        return false;
        // todo
    }
}

ReviewDAO_Factory. java

public class ReviewDAO_Factory {

    public ReviewDAO getReviewDAO(String technology) throws ExecutionControl.NotImplementedException {
        if (technology.equals("mongodb"))
            return new ReviewDAO_MongoDB();
        else
            throw new ExecutionControl.NotImplementedException("");
    }
}

BusinessLogi c. java

public class BusinessLogic {
    public static void main(String[] args) throws ExecutionControl.NotImplementedException {
        ReviewDAO_Factory reviewDAO_factory = new ReviewDAO_Factory();
        RegisteredUser registeredUser = new RegisteredUser("Alessandro");

        registeredUser.addReview(reviewDAO_factory.getReviewDAO("mongodb"));
        System.out.println(registeredUser.toString());
    }
}

Я получаю

Исключение в потоке " main "java .lang.StackOverflowError в RegisteredUser.toString (RegisteredUser. java: 33) в java .base / java .lang.String.valueOf (String. java: 2951) в ReviewDAO. toString (ReviewDAO. java: 15) ...

Процесс завершен с кодом выхода 1

ошибки

1 Ответ

0 голосов
/ 13 июля 2020

Прежде всего, дизайн выглядит некорректно. Никогда не следует смешивать POJO с DAO. DAO - это классы «объектов доступа к данным», которые имеют дело с CRUD-операциями над POJO. Здесь у вас есть 2 POJO - Review и RegisteredUser. ReviewDAO несет ответственность за выполнение операций CRUD над управляемыми / неуправляемыми экземплярами (или объектами) Review. И для RegisteredUser вам, вероятно, понадобится еще один POJO (в вашем фактическом коде).

Во-вторых, я вижу, что вы вызываете метод List contains, чтобы проверить, дал ли пользователь этот отзыв, но вы еще не реализованы «равно» и «hashCode» в ReviewDAO .

public void addReview(ReviewDAO review) {
        if (!this.reviews.contains(review)) {
            this.reviews.add(review);
            review.addRegisteredUser(this);
        }
    }

Я сделал несколько настроек. Пожалуйста, проверьте, удовлетворяет ли он вашу потребность:

RegisteredUser class (вы использовали хэш-набор, потому что поиск "содержит" будет быстрее)

public class RegisteredUser {
  private String nickname;
  private Set<Review> reviews;

  public RegisteredUser(String nickname) {
    this.nickname = nickname;
    reviews = new HashSet<>();
  }

  public String getNickname() {
    return nickname;
  }

  public void setNickname(String nickname) {
    this.nickname = nickname;
  }

  public void addReview(Review review) {
    if (!this.reviews.contains(review)) {
      this.reviews.add(review);
      //review.addRegisteredUser(this);
    }
  }

  @Override
  public String toString() {
    return "RegisteredUser{" +
        "nickname='" + nickname + '\'' +
        ", reviews=" + reviews +
        '}';
  }
}

ReviewDAO class :

public abstract class ReviewDAO {
  private RegisteredUser registeredUser;

  public abstract boolean write(Review review);

  public void addRegisteredUser(RegisteredUser registeredUser) {
    this.registeredUser = registeredUser;
  }

}

Класс проверки :

public class Review {
  private String title;
  private String description;
  private int rank;
  private boolean isAnonymous;

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  public String getDescription() {
    return description;
  }

  public void setDescription(String description) {
    this.description = description;
  }

  public int getRank() {
    return rank;
  }

  public void setRank(int rank) {
    this.rank = rank;
  }

  public boolean isAnonymous() {
    return isAnonymous;
  }

  public void setAnonymous(boolean anonymous) {
    isAnonymous = anonymous;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o)
      return true;
    if (o == null || getClass() != o.getClass())
      return false;
    Review review = (Review) o;
    return Objects.equals(title, review.title);
  }

  @Override
  public int hashCode() {
    return Objects.hash(title);
  }
}

BusinessLogi c класс

public class BusinessLogic {
  public static void main(String[] args) throws ExecutionControl.NotImplementedException {
    ReviewDAO_Factory reviewDAO_factory = new ReviewDAO_Factory();

    RegisteredUser registeredUser = new RegisteredUser("Alessandro");

    Review review = new Review();
    review.setTitle("some review");
    review.setDescription("some desc");

    registeredUser.addReview(review);

    ReviewDAO reviewDAO = reviewDAO_factory.getReviewDAO("mongodb");
    reviewDAO.addRegisteredUser(registeredUser);

    System.out.println(registeredUser.toString());
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...