Исключение NullPointerException: попытка вызвать виртуальный метод ‘long java.util.Date.getTime()’ для ссылки на нулевой объект

#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. Я также редактирую его. Извините, мне всегда нужно несколько минут, чтобы перевести все мои переменные с немецкого на английский.