java - 调用 toString 方法时出现堆栈溢出错误
问题描述
这是我的代码,但是当我执行程序时出现很多错误,我不知道为什么。有人可以帮助我吗?
注册用户.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 +
'}';
}
}
回顾DAO.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
}
}
回顾DAO_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("");
}
}
业务逻辑.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());
}
}
我正进入(状态
在 ReviewDAO.toString(ReviewDAO.java: 15) ...
进程以退出代码 1 结束
错误
解决方案
首先,设计看起来有问题。永远不要将 POJO 与 DAO 混合使用。DAO 是处理 POJO 上的 CRUD 操作的“数据访问对象”类。在这里,您有 2 个 POJO - Review 和 RegisteredUser。ReviewDAO 负责对 Review 的托管/非托管实例(或实体)执行 CRUD 操作。对于RegisteredUser,您可能还需要另一个POJO(在您的实际代码中)。
其次,我看到您正在调用 List contains 方法来检查用户是否已经给出了该评论,但您尚未在 ReviewDAO 中实现“equals”和“hashCode”。
public void addReview(ReviewDAO review) {
if (!this.reviews.contains(review)) {
this.reviews.add(review);
review.addRegisteredUser(this);
}
}
我做了一些调整。请检查它是否满足您的需求:
RegisteredUser 类(已使用 hashset 导致“包含”搜索会更快)
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 +
'}';
}
}
回顾DAO类:
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);
}
}
业务逻辑类
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());
}
}
推荐阅读
- java - 如何使用单循环在两个数组中找到相同的元素?
- opencv - OpenCv获取到圆心的边缘距离
- sql - 如何编写查询以在 SQL 中排除一个部门中至少有一个 30 岁的人的所有员工
- python - 我想在 for 循环中串联运行多个变量,我想取 x 和 y 的每次迭代的总和
- cuda - %envregN 特殊寄存器保存什么?
- c# - 从 StringBuilder 中删除双新行
- c# - 抑制子进程的输出
- java - 如何使用输入和单元测试来测试java程序
- laravel - 在 Laravel API 中检索和保存通过 guzzle 多部分参数传递的图像
- c# - 使用 C# 按属性名称搜索 XML 值