package com.javarush.task.task08.task0824;
/*
Собираем семейство
*/
import java.util.ArrayList;
import java.util.Arrays;
public class Solution {
public static void main(String[] args) {
ArrayList<Human> children = new ArrayList<>();
Human children1 = new Human("Григорий", true, 27);
Human children2 = new Human("Ядвига", false, 23);
Human children3 = new Human("Клеопатра", false, 19);
children.add(children1);
children.add(children2);
children.add(children3);
Human father = new Human("Василий", true, 45, children);
Human mother = new Human("Галина", false, 43, children);
ArrayList<Human> childrenofgrand1 = new ArrayList<>();
ArrayList<Human> childrenofgrand2 = new ArrayList<>();
childrenofgrand1.add(father);
childrenofgrand2.add(mother);
Human grandfather1 = new Human("Дмитрий", true, 69, childrenofgrand1);
Human grandmother1 = new Human("Мария", false, 63, childrenofgrand1);
Human grandfather2 = new Human("Алексей", true, 63, childrenofgrand2);
Human grandmother2 = new Human("Инна", false, 59, childrenofgrand2);
System.out.println(grandfather1);
System.out.println(grandfather2);
System.out.println(grandmother1);
System.out.println(grandmother2);
System.out.println(father);
System.out.println(mother);
System.out.println(children1);
System.out.println(children2);
System.out.println(children3);
}
public static class Human {
String name;
boolean sex;
int age;
ArrayList<Human> children;
public Human(String name, boolean sex, int age, ArrayList<Human> children){
this.name = name;
this.sex = sex;
this.age = age;
this.children = children;
}
public Human(String name, boolean sex, int age){
this.name = name;
this.sex = sex;
this.age = age;
}
public String toString() {
String text = "";
text += "Имя: " + this.name;
text += ", пол: " + (this.sex ? "мужской" : "женский");
text += ", возраст: " + this.age;
int childCount = this.children.size();
if (childCount > 0) {
text += ", дети: " + this.children.get(0).name;
for (int i = 1; i < childCount; i++) {
Human child = this.children.get(i);
text += ", " + child.name;
}
}
return text;
}
}
}
Вячеслав
23 уровень
Дети не хотят на печать...((
Решен
Комментарии (9)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
hidden #598481
24 марта 2020, 14:24
Когда ты создаешь детей, у них поле children остается равным null, не пустому списку, а именно null. Поэтому ты не можешь даже посмотреть размер этого списка тут:т.к. никакого списка нет, и возникает NullPointerException
0
Вячеслав
24 марта 2020, 14:43
Почему null то? Делал распечатку сразу после создания children.add(children1); .... children.size выводил на печать "3". Не понимаю...
0
hidden #598481
24 марта 2020, 14:53
Я не про это, а вот про это:
у каждого объекта класса Human есть свое поле children, которое может содержать список детей. А может не содержать, если у человека нет детей. Как раз у children1, children2, children3 - детей нет.
Кстати, единственное число от слова children - это child.
0
Вячеслав
24 марта 2020, 14:58
Согласен.
Но у меня есть же конструктор специально без детей для этого случая. И когда создавал объекты children, то разумеется, и отпрысков у них нет (в соответствии с конструктором).
0
hidden #598481
24 марта 2020, 15:21
Я тебе об этом и говорю.
Ты воспользовался конструктором с тремя аргументами, поле children у каждого из созданных детей осталось не инициализированным. Дети (как и все другие гуманоиды) создались успешно.
Дальше ты пытаешься вывести их на экран.
Как ты это делаешь? Вызываешь println(). Тот под капотом дергает toString().
А дальше проверь построчно, что произойдет внутри метода toString(), если поле children не инициализировано? имя, пол, возраст - все ок. А дальше?а children-то у тебя null. А у null метод вызвать нельзя, будет NPE.
О чем я тебе в первом комментарии и написал.
0
Вячеслав
24 марта 2020, 15:27
Т.е выходит так, что если в конструкторе нет children, а в классе он есть, он все равно попадает в обработку строк?
0
Mark Aminov
24 марта 2020, 16:50
Можно просто создать пустой список и использовать его у детей четвёртым параметром. Тогда и лишний конструктор можно удалить. И всё заработает, что самое главное)
0
hidden #598481
25 марта 2020, 07:51
А как вообще метод toString() связан с конструктором?
У класса есть поля, метод обращается к их значениям. Нет значения - значит поле содержит null.
0
hidden #598481
25 марта 2020, 07:52
Mark, тогда уж лучше сразу инициализировать поле значением new ArrayList<>, а в конструкторе просто добавлять в него значения из параметра. Тогда не придется вручную создавать пустые списки для каждого ребенка.
Лучше наоборот предусматривать всевозможные конструкторы, которые могут пригодиться, чтобы было меньше кода при создании объектов, чем наоборот - танцевать с бубном для создания объектов, подгоняя все под один конструктор.
0