#java #android
#java #Android
Вопрос:
Я изучаю разработку Android и в настоящее время разрабатываю игру, в которой на экране появляются маленькие мухи, и пользователь должен щелкнуть по ним, чтобы они исчезли. Но мой метод для их удаления просто выдает мне эту ошибку: java.lang.Исключение NullPointerException: попытка вызвать виртуальный метод ‘long java.util.Date.getTime()’ для ссылки на нулевой объект
private void removeFlys() {
int number=0;
while(number < playarea.getChildCount()) {
ImageView muecke = (ImageView) playarea.getChildAt(number);
Date birthdate = (Date) muecke.getTag(R.id.birthdate);
long age = (new Date()).getTime() - birthdate.getTime();
if(alter > 2000) {
playarea.removeView(muecke);
} else {
number ;
}
}
}
это XML-файл, в котором определен тег даты рождения
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name = "birthdate" type ="id" />
</resources>
Это мой код для запуска flys
private void spawnFlys() {
int width = playarea.getWidth();
int heigth = playarea.getHeight();
int muecke_width = Math.round(x * 50);
int muecke_heigth = Math.round(x * 42);
int left = randomgenerator.nextInt(width - muecke_width);
int top = randomgenerator.nextInt(heigth - muecke_heigth);
ImageView muecke = new ImageView(this);
muecke.setImageResource(R.drawable.fliege);
muecke.setOnClickListener(this);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(muecke_width, muecke_heigth);
params.leftMargin = left;
params.topMargin = top;
params.gravity = Gravity.TOP Gravity.LEFT;
playarea.addView(muecke, params);
muecke.setTag(R.id.birthdate, new Date());
}
И именно здесь вызывается метод spawnFlys
private void timer(){
time = time -1;
float randomNumber = randomgenerator.nextFloat();
double probabilitiy = muecken * 1.5;
if(probability > 1) {
spawnFlys();
if(randomNumber < probability -1) {
spawnFlys();
}
} else {
if (randomNumber < probability) {
spawnFlys();
}
}
removeFlys();
updateScreen();
if(!checkGameDone()) {
if(!checkRoundDone()){
handler.postDelayed(this, 1000);
}
}
}
Комментарии:
1. На что ссылается R.id.birthdate?
2. Установите флажок перед добавлением в
playerArea
. Вы дали ссылку перед определением.3. Я сделал это @adnbsr, но это не помогло
4. Я вижу эту строку
double probabilitiy = muecken * 1.5;
. Где вы определилиmuecken
и какое значение вы ему присвоили?
Ответ №1:
Я думаю, Date birthdate = (Date) muecke.getTag(R.id.birthdate);
возвращает null попробуйте выйти из системы, чтобы посмотреть, что произойдет
Комментарии:
1. Как я могу войти в систему? Я действительно новичок в Android, сейчас работаю над книгой для начинающих, и это код книги, который не работает… Я попробовал Log.e(«MyTag», birthdate» но ему нужна строка
2. @JangoCG извините, я не видел уведомления, вы, вероятно, уже исправили это, верно? если нет, то ImageView «muecke» еще не инициализирован
3. @JangoCG кстати, я не понимаю muecke , это просмотр изображения в
spawnFly()
, но вы используете его в вычислениях вdouble probabilitiy = muecken * 1.5
4. Спасибо за помощь, но я отказался от этого и вернул книгу. Было действительно неприятно, когда пример из книги не сработал, и даже несмотря на то, что это код «решения» с веб-сайта издателей.
Ответ №2:
Значение, возвращаемое getTag
всегда будет равно null, если вы не вызвали его setTag
заранее. Похоже, что ваш макет представляет собой список ImageViews
внутри родительского представления, поэтому в какой-то момент заранее вам нужно установить R.id.birthDate
для всех этих ImageView
объектов. Что-то вроде этого:
for (int i = 0; i < playarea.getChildCount(); i ) {
View muecke = playarea.getChildAt(i);
Date birthdate = getTheDateForThisViewFromSomewhere();
muecke.setTag(R.id.birthDate, birthDate);
}
Комментарии:
1. Я вызываю setTag при создании flys. Я отредактировал свой вопрос и также вставил код для создания мух
2. Я также редактирую его. Извините, мне всегда нужно несколько минут, чтобы перевести все мои переменные с немецкого на английский.