Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用toString方法时发生堆栈溢出错误_Java_Design Patterns - Fatal编程技术网

Java 调用toString方法时发生堆栈溢出错误

Java 调用toString方法时发生堆栈溢出错误,java,design-patterns,Java,Design Patterns,这是我的代码,但当我执行程序时,我会出现很多错误,我不知道为什么。有人能帮我吗 RegisteredUser.java public class RegisteredUser { private String nickname; ArrayList<ReviewDAO> reviews; public RegisteredUser(String nickname) { this.nickname = nickname; rev

这是我的代码,但当我执行程序时,我会出现很多错误,我不知道为什么。有人能帮我吗

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 +
                '}';
    }
}
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 +
                '}';
    }
}
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;
    }
}
public class ReviewDAO_MongoDB extends ReviewDAO {
    @Override
    public boolean write(Review review) {
        return false;
        // todo
    }
}
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("");
    }
}
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());
    }
}
Review.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 +
                '}';
    }
}
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 +
                '}';
    }
}
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;
    }
}
public class ReviewDAO_MongoDB extends ReviewDAO {
    @Override
    public boolean write(Review review) {
        return false;
        // todo
    }
}
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("");
    }
}
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());
    }
}
查看wao\u MongoDB.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 +
                '}';
    }
}
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 +
                '}';
    }
}
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;
    }
}
public class ReviewDAO_MongoDB extends ReviewDAO {
    @Override
    public boolean write(Review review) {
        return false;
        // todo
    }
}
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("");
    }
}
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());
    }
}
查看Dao_Factory.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 +
                '}';
    }
}
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 +
                '}';
    }
}
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;
    }
}
public class ReviewDAO_MongoDB extends ReviewDAO {
    @Override
    public boolean write(Review review) {
        return false;
        // todo
    }
}
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("");
    }
}
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());
    }
}
BusinessLogic.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 +
                '}';
    }
}
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 +
                '}';
    }
}
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;
    }
}
public class ReviewDAO_MongoDB extends ReviewDAO {
    @Override
    public boolean write(Review review) {
        return false;
        // todo
    }
}
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("");
    }
}
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.StackOverflowerr中出现异常 在RegisteredUser.toString(RegisteredUser.java:33) 位于java.base/java.lang.String.valueOf(String.java:2951) 在ReviewDAO.toString(ReviewDAO.java:15)

进程已完成,退出代码为1


错误首先,这个设计看起来有缺陷。你不应该把POJO和DAO混在一起。DAO是处理POJO上CRUD操作的“数据访问对象”类。这里有2个POJO-查看和注册用户。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类(已使用哈希集,因为“包含”搜索将更快)

复习课:

业务逻辑类


RegisteredUser.toString()
中,您正在打印每个
ReviewDAO
然后打印出
RegisteredUser
然后打印每个
ReviewDAO
然后…@Seelenvirtuose如何解决此错误?这里讨论了类似的情况:。父项>子项>父项。。。无限循环。这能回答你的问题吗@同样的错误。。。如果我的代码是错误的,而不仅仅是被重写的toString()方法呢?如果我没有在Review.java中重写equals和hash呢?为什么我的设计有问题?包含检查的内容将不正确。只有当两个对象引用相同时(在JVM内存中),它才会返回true。我只根据它们的标题比较了两个评论。您也可以在比较时添加其他字段,如描述。为什么我的设计有问题?RegisteredUser实体不应与ReviewDAO关联,而应与Review关联?