LINUX.ORG.RU

Почему такое использование выдает null pointer exception?

 


0

1

Основной класс

public class Cars implements GLEventListener {
   static Scene1 scene;
 @Override
   public void init(GLAutoDrawable drawable) {
...
try {
           scene.LoadDrum(drawable);
      } catch (IOException ex) {
           Logger.getLogger(Cars.class.getName()).log(Level.SEVERE, null, ex);
      }
   }
public static void main(String[] args) {
   
      scene = new Scene1();
      scene.Scene();
Cars r = new Cars();

...
}
}
public class Scene1 { 
    class Image
    {
  int IndexTexture;
  String Name;
  int number;
    }
static final int CountTexture = 1;
int Scene()
    {
  image = new Image[CountTexture];
        CountIndexTexture = 0;
        vectordrum = new Vector<String>();
        return 0;
    }
    
int LoadDrum(GLAutoDrawable drawable) throws IOException
    {
...

 CountIndexTexture++;
                image[CountIndexTexture - 1].Name = "auto1";
    image[CountIndexTexture - 1].number = CountIndexTexture - 1;
                image[CountIndexTexture - 1].IndexTexture = t.getTextureObject(gl);
...
}
}
ошибка выдается при присваивании массиву image значений в поля

ошибка выдается при присваивании массиву image значений в поля

а что собственно непонятного?
либо CountIndexTexture = null, либо image[CountIndexTexture - 1] = null
по хорошему там еще нужна проверка на то что CountIndexTexture>0 && CountIndexTexture < image.length и в целом код какой-то без защиты от дурака

rukez ★★★ ()

Найми уже себе репетитора. Затрахал с тупыми вопросами на форум лезть.

cocucka ★★★★★ ()
Ответ на: комментарий от bad_master

там трабла вроде память надо выделить для полей переменной image

нет, у тебя банально либо нет индекса, по которому ты пытаешься найти объект, либо нет объекта по индексу, которому ты пытаешься записать поле. в яве всё намного проще, а до принудительного выделения памяти тебе еще ой как далеко :-)

запусти отладчик да посмотри что с переменными в этой строке.

и да, повторюсь что твоя библиотека или пример, который ты пытаешься использовать, совсем без защиты от дурака и предполагает что ты ЧЕТКО понимаешь что делаешь и в какой последовательности вызываешь функции, заполняющие поля класса. так обычно не делают ибо это моветон с точки зрения явы, но иногда так пытаются «оптимизировать»

rukez ★★★ ()
Ответ на: комментарий от rukez

Как может в такой последовательности быть ошибка?

static final int CountTexture = 1;
image = new Image[CountTexture];
CountIndexTexture = 0;
CountIndexTexture++;
image[CountIndexTexture - 1].Name = "auto1";

bad_master ()
Ответ на: комментарий от bad_master

Как может в такой последовательности быть ошибка?

легко, чтоб в image[0] появился Image надо его туда вначале положить. ты обьявляешь массив картинок длинной 1, но не кладешь туда ничего
т.е.:

Image[] = new Image[1];  
Image img = Image(что там в конструкторе);  
image[0] = img;  
image[0].Name = "auto0";  

и да, чтоб не путаться логично image называть картинку, а массив images :-)

rukez ★★★ ()
Последнее исправление: rukez (всего исправлений: 2)
Ответ на: комментарий от kardapoltsev

Да спасибо, вот решение

private Image(int textureObject, String auto1, int i) {
        this.IndexTexture = textureObject;
        this.Name = auto1;
        this.number = i;
        }
...

                img = new Image(t.getTextureObject(gl),"auto1",CountIndexTexture - 1);
                image[CountIndexTexture - 1] = img;
bad_master ()
Последнее исправление: bad_master (всего исправлений: 1)
Ограничение на отправку комментариев: только для зарегистрированных пользователей