Комментарии 25
АААА!!! Помогите.
Что с хабром??? Я хотел сделать правку в статье, а он еще одну создал. Немогу скрыть. Немогу в черновики публикануть. Что с ним????
Что с хабром??? Я хотел сделать правку в статье, а он еще одну создал. Немогу скрыть. Немогу в черновики публикануть. Что с ним????
Я конечно полный лузер в Java, но разве в последнем листинге не должно быть b.Turn();?
public Bot(int energy, String name, World world) {
//...
if (this.energy < 1) {
this.live = false;
} else {
live = true;
}
//...
}
У Вас боты создаются мёртвыми независимо от переданной в конструктор энергии.
Ну и World.Turn() их обнуляет.
Ну и сама эта конструкция являет собой отличный образчик индийского кода :)
Может лучше всё же
Может лучше всё же
this.live = (energy>=1)
Bot b = new Bot(20, «B», w)
Создавался с енергией 20, тоесть живой.
Создавался с енергией 20, тоесть живой.
ссылка не теряется — у вас же она хранится в residents[1][2]. поэтому никто её собрать не должен.
код не падает, и не должен. хотя баги есть (например размерность массива [height][width], а используется как [width][height])
код не падает, и не должен. хотя баги есть (например размерность массива [height][width], а используется как [width][height])
Но все же он падает… Причем как я говорил не на каждом компе.
Милости просим. botworld.googlecode.com/svn/trunk/BotWorld/
Милости просим. botworld.googlecode.com/svn/trunk/BotWorld/
я бы предположил, что падает из-за world.ResidentAction(this, (ACTION) moves.lastElement()) в Bot.
при этом обнуляется ссылка в массиве — что приведет к NRE при вызове isLive()
при этом обнуляется ссылка в массиве — что приведет к NRE при вызове isLive()
Да падает на isLive().
А что плохого в world.ResidentAction(this, (ACTION) moves.lastElement())?
А что плохого в world.ResidentAction(this, (ACTION) moves.lastElement())?
там обнуляется элемент массива в некоторых кейсах (разве нет?), а в турн вы пытаетесь его использовать
ААА!!! Точно. residents[res.X()][res.Y()] = null;
Большое спасибо!
А как же оно работало на других компах????
Большое спасибо!
А как же оно работало на других компах????
также, просто этот кейс не выпадал на исполнение скорее всего
выпадал 100%. код не менялся. ВОт там сборщик работал действительно странно.:)
забудьте про сборщик. в 99.99% случаях код фреймворка работает верно
Завтра протестирую на том компе, на котором не вылитало исключение и отпишусь.
Еще раз спасибо за полезный опыт.
Еще раз спасибо за полезный опыт.
Все оказалось просто, ошибка в логике. Мой напарник, который тестил этот код и у которого небыло ошибки, просто удалил кусок кода в котором вносились хода в лист. Ходов небыло, перемещений небыло, исключений небыло… вот и все.
Нужно вместо
residents[i][j]).Turn();
if(!residents[i][j].isLive()) residents[i][j] = null;
написать
if(!residents[i][j].isLive()) residents[i][j] = null;
else{
residents[i][j]).Turn();
}
residents[i][j]).Turn();
if(!residents[i][j].isLive()) residents[i][j] = null;
написать
if(!residents[i][j].isLive()) residents[i][j] = null;
else{
residents[i][j]).Turn();
}
Спасибо. Сам бы не нашел.
Название топика звучит как отличная вакансия =)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Интересная работа сборщика мусора