面向对象 Java

object oriented Java

我是一名学生,目前正在学习基本的面向对象 java,我正在尝试创建一个 OOP 程序,它有 3 个 class 青年组,部分和成员一个青年组有 3 个部分,一个功能对于这个程序应该是一个成员不能在同一部分列出两次现在我正在尝试创建这个函数:

public boolean setMembers(members members) {
    boolean crouded = true;

    for(int i = 0; i<this.getMembers().size();i++) {
        if(!this.members.contains(member)) {
            this.members.add(member);
        }
        else {
            System.out.println("Member already exists in this section");
            crouded = false;
        }
    }
    return crouded;
}

现在在主要方法中,我正在执行以下操作:

public static void main(String[] args) {
    List<member> m = new ArrayList<>();
    Section s = new Section(m,"programming",3);
    member m1 = new member("tom",21,"male",s);
    member m2 = new member("kate",20,"Female",s);
    m.add(m1);
    m.add(m2);
    s.setMembers(m1);
    s.filterAge(21);
    System.out.println(s);
}

它给我以下错误:

   Exception in thread "main" java.lang.WhosebugError
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:648)
    at java.lang.StringBuilder.append(StringBuilder.java:208)
    at youthgroup.member.toString(member.java:62)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.member.toString(member.java:64)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at youthgroup.Section.toString(Section.java:68)
    at java.lang.String.valueOf(String.java:2981)
    at java.lang.StringBuilder.append(StringBuilder.java:131)

它会永远持续下去。

这是成员 class :

package youthgroup;

import java.util.Objects;

/**
 *
 * @author student
 */
public class member {
    private String name;
    private int age ; 
    private String gender;
    private Section section;

    public member(String name, int age, String gender, Section section) {
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.section = section;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Section getSection() {
        return section;
    }

    public void setSection(Section section) {
        this.section = section;
    }

    @Override
    public String toString() {
        String word = "Member name " +name;
        word+= "age : "+getAge();
        word+="Gender : "+ getGender();
        word+= " is in section : "+getSection();
        return word;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 67 * hash + this.age;
        hash = 67 * hash + Objects.hashCode(this.gender);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final member other = (member) obj;
        if (this.age != other.age) {
            return false;
        }
        if (!Objects.equals(this.gender, other.gender)) {
            return false;
        }
        return true;
    }





}

这是 class 部分:

public class Section {
    private List<member>members;
    private String sectionName;
    private int maxNumber;

    public Section(List<member> members, String sectionName, int maxNumber) {
        this.members = members;
        this.sectionName = sectionName;
        this.maxNumber = maxNumber;
    }

    public List<member> getMembers() {
        return members;
    }

    public boolean setMembers(member member) {
        boolean crouded = true;

            for(int i = 0; i<this.getMembers().size();i++){
                if(!this.members.contains(member)){
                    this.members.add(member);
                }else{
                    System.out.println("Member already exists in this section");
                    crouded = false;
                }

            }



        return crouded;

    }

public String getSectionName() {
    return sectionName;
}

public void setSectionName(String sectionName) {
    this.sectionName = sectionName;
}

public int getMaxNumber() {
    return maxNumber;
}

public void setMaxNumber(int maxNumber) {
    this.maxNumber = maxNumber;
}

@Override
public String toString() {
    String word = " section name is : "+ getSectionName();
    word+=" Max number of members it can contain : "+ getMaxNumber();
    word+= " List of members :  "+getMembers();
    return word;
}

public boolean filterByAge(int a){
    boolean found = true;
    for(int i = 0; i<this.members.size(); i++){
        if(this.members.contains(a)){
            System.out.println("These members where found with this age  : "+ this.members.get(i).getName());
        }else{
            System.out.println("No member found !!!");
            found = false;
        }


    }

    return found;


}

非常感谢您的帮助,在此先感谢您。

您的 toString() 方法正在对自身进行递归调用。

toString() 方法调用 getSection(),这将 return 一个 Section 对象,该对象将 toString() 显式调用它。此 toString() 本身将获得 Listmember 对象,它将调用 toString(),但是,第二个 toString() 方法本身将回调 member toString() 方法,它会一次又一次地回调。你看到问题了,我想。

这将导致 WhosebugError,因为它将无限深入地循环到调用堆栈中。

word+= " is in section : "+getSection();
//section is returned and called toString()
word+= " List of members :  "+getMembers();
//List of members are returned and called `toString()`, which will loop back to first line I've written

这里要了解的重要一点是当您在 Java 中使用 + 运算符时会发生什么。在 Objects 之间使用时,包括 String 对象或您定义的任何 Objects+ 运算符会将其左右手边的参数显式转换为 Strings .在 Java 中完成此操作的方式是隐式调用您已覆盖的 toString() 方法,但如果您未覆盖它,它仍然会存在(它在 Object超类,因此所有 Java 对象都继承了一些基本实现)