Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> java.lang.NullPointerException, Откуда? 
:(
    Опции темы
DeMoNN
Дата 2.4.2009, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 21.3.2008

Репутация: нет
Всего: 2



Все сбилдил прекрасно, но вот выдает при запуске на эмуляторе:
Код

startApp threw an Exception
java.lang.NullPointerException
java.lang.NullPointerException
    at Game.init(+16)
    at midlet.startApp(+22)
    at javax.microedition.midlet.MIDletProxy.startApp(+7)
    at com.sun.midp.midlet.Scheduler.schedule(+270)
    at com.sun.midp.main.Main.runLocalClass(+28)
    at com.sun.midp.main.Main.main(+80)


Код

import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.Display;

public class midlet extends MIDlet
{
  public void pauseApp(){}
  public void destroyApp(boolean destroy) { notifyDestroyed(); }
  public void startApp()
  {
    Display disp = Display.getDisplay(this);
    Game game = new Game();
    disp.setCurrent(game);
    game.init();
    game.main();
  }
}


это мой код гланого класса мидлета. В чем у меня ошибка?
PM MAIL ICQ   Вверх
eugine_s
Дата 2.4.2009, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

Репутация: 17
Всего: 17



Цитата(DeMoNN @  2.4.2009,  10:25 Найти цитируемый пост)
java.lang.NullPointerException
    at Game.init(+16)


Метод init() в классе Game выдает ошибку.
PM MAIL   Вверх
DeMoNN
Дата 2.4.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 21.3.2008

Репутация: нет
Всего: 2



непонимаю, где, теперь вроде все инициализировал, теперь пишет
Код

startApp threw an Exception
java.lang.NullPointerException
java.lang.NullPointerException
    at Game.init(+55)
    at Game.<init>(+99)
    at midlet.startApp(+12)
    at javax.microedition.midlet.MIDletProxy.startApp(+7)
    at com.sun.midp.midlet.Scheduler.schedule(+270)
    at com.sun.midp.main.Main.runLocalClass(+28)
    at com.sun.midp.main.Main.main(+80)

что здесь может это вызывать?
Код

  public Snake snake = new Snake();
  public Heart heart = new Heart();

Код

  public void init()
  {
    gameOver = false;
    snake.maxX = getWidth() / 12;
    snake.maxY = getHeight() / 12;
    for (int i = 1; i < 5; i++)
    {
      snake.parts[i] = new Part();
          snake.parts[i].x = i * 12;
          snake.parts[i].y = snake.maxY / 2;
    }
    snake.lastPart = 4;
      generateRandomXY();
      redrawScreen();
  }

Код

  public void generateRandomXY()
  {
    while (true)
      {
          heart.x = Math.abs(rnd.nextInt()) % snake.maxX + 1;
          heart.y = Math.abs(rnd.nextInt()) % snake.maxY + 1;
          for (int i = 1; i <= snake.lastPart; i++)
              if ( (snake.parts[i].x == heart.x) && (snake.parts[i].y == heart.y) ) {} else return;
        }
  }

Код

  public void redrawScreen()
  {
    gg.setClip(getWidth() / 2 - snake.maxX / 2, getHeight() / 2 - snake.maxY / 2, getWidth() / 2 + snake.maxX / 2, getHeight() / 2 + snake.maxY / 2);
    for (int i = 1; i <= snake.lastPart; i++)
      gg.drawImage(partImg, snake.parts[i].x * 12, snake.parts[i].y * 12, gg.TOP|gg.LEFT);
    gg.drawImage(heartImg, heart.x, heart.y, gg.TOP|gg.LEFT);
  }

Код

public class Snake
{
  public int direction;
  public Part[] parts;
  public int lastPart;
  public int maxX;
  public int maxY;
  public Snake()
  {
    direction = 0;
    lastPart = 0;
    maxX = 0;
    maxY = 0;
  }
}

Код

public class Part
{
  public int x;
  public int y;
  public Part ()
  {
    x = 0;
    y = 0;
  }
}

Код

public class Heart
{
  public int x;
  public int y;
  public Heart()
  {
    x = 0;
    y = 0;
  }
}

PM MAIL ICQ   Вверх
eugine_s
Дата 2.4.2009, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

Репутация: 17
Всего: 17



Код

public class Snake
{

  public Part[] parts;

}


А это разве не нужно инициализировать?  Сначала массив, а потом каждый элемент массива.


И еще одно: зачем использовать массив ? ты знаешь что число этих part-ов у тебя будет фиксированое? Как на счет Vector-a? 

И еще одно: что такое сеттеры/геттеры слышал? 
PM MAIL   Вверх
DeMoNN
Дата 2.4.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 21.3.2008

Репутация: нет
Всего: 2



 сейчас попробую с вектором

PM MAIL ICQ   Вверх
eugine_s
Дата 2.4.2009, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

Репутация: 17
Всего: 17



Цитата(DeMoNN @  2.4.2009,  14:49 Найти цитируемый пост)
сейчас попробую с вектором


вектор тоже нужно инициализировать. Vector v = new Vector(); 
PM MAIL   Вверх
DeMoNN
Дата 2.4.2009, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 21.3.2008

Репутация: нет
Всего: 2



я знаю, уже переделываю прогу. она мне 58 ошибок выдала, сейчас исправляю.
PM MAIL ICQ   Вверх
DeMoNN
Дата 2.4.2009, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 21.3.2008

Репутация: нет
Всего: 2



отлично, java.lang.NullPointerException уже нет, но есть
Код

startApp threw an Exception
java.lang.ArrayIndexOutOfBoundsException: 1 >= 1
    at java.util.Vector.elementAt(+41)
    at Game.init(+68)
    at Game.<init>(+99)
    at midlet.startApp(+12)
    at javax.microedition.midlet.MIDletProxy.startApp(+7)
    at com.sun.midp.midlet.Scheduler.schedule(+270)
    at com.sun.midp.main.Main.runLocalClass(+28)
    at com.sun.midp.main.Main.main(+80)

здесь
Код

  public void init()
  {
    gameOver = false;
    snake.maxX = getWidth() / 12;
    snake.maxY = getHeight() / 12;
    for (int i = 1; i < 5; i++)
    {
      snake.parts.addElement(new Part());
      ((Part)snake.parts.elementAt(i)).x = i * 12;
          ((Part)snake.parts.elementAt(i)).y = snake.maxY / 2;
    }
    snake.lastPart = 4;
      generateRandomXY();
      redrawScreen();
  }

PM MAIL ICQ   Вверх
eugine_s
Дата 2.4.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 14.11.2007
Где: Киев

Репутация: 17
Всего: 17



Код

for (int i = 1; i < 5; i++)
    {
      snake.parts.addElement(new Part());
      ((Part)snake.parts.elementAt(i)).x = i * 12;
          ((Part)snake.parts.elementAt(i)).y = snake.maxY / 2;
    }


1) Паскаль/Делфи говоришь любишь? smile

В java массивы с 0-ля начинаются. [1] - это второй элемент.

Советую переключиться сейчас с j2me на j2se и разобраться хоть чуть-чуть с ней, так как на таких мелочах затрудняешься. А ты ведь еще до потоков не добрался

2) Зачем сначала запихивать в вектор а потом извлекать из нее элемент? 
Лучше все же вот так сделать: 
Код

Part p = new Part();
p.x = (i+1) * 12; //i+1 - так как i лучше с 0-ля начинать
p.y = snake.maxY / 2; 
snake.parts.addElement(p);


А еще лучше почитать книгу по j2se.
PM MAIL   Вверх
DeMoNN
Дата 2.4.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 21.3.2008

Репутация: нет
Всего: 2



а, все, разобрался. Но теперь опять
Код

startApp threw an Exception
java.lang.NullPointerException
java.lang.NullPointerException
    at Game.redrawScreen(+68)
    at Game.init(+297)
    at Game.<init>(+99)
    at midlet.startApp(+12)
    at javax.microedition.midlet.MIDletProxy.startApp(+7)
    at com.sun.midp.midlet.Scheduler.schedule(+270)
    at com.sun.midp.main.Main.runLocalClass(+28)
    at com.sun.midp.main.Main.main(+80)

Код

  public void init()
  {
    gameOver = false;
    snake.maxX = getWidth() / 12;
    snake.maxY = getHeight() / 12;
    snake.parts.addElement(new Part());
    snake.parts.addElement(new Part());
    snake.parts.addElement(new Part());
    snake.parts.addElement(new Part());
    ((Part)snake.parts.elementAt(0)).x = 1 * 12;
        ((Part)snake.parts.elementAt(0)).y = snake.maxY / 2;
    ((Part)snake.parts.elementAt(1)).x = 2 * 12;
        ((Part)snake.parts.elementAt(1)).y = snake.maxY / 2;
    ((Part)snake.parts.elementAt(2)).x = 3 * 12;
        ((Part)snake.parts.elementAt(2)).y = snake.maxY / 2;
    ((Part)snake.parts.elementAt(3)).x = 4 * 12;
        ((Part)snake.parts.elementAt(3)).y = snake.maxY / 2;
    snake.lastPart = 3;
      generateRandomXY();
      redrawScreen();
  }

PM MAIL ICQ   Вверх
mopsa
Дата 5.4.2009, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 11.1.2009
Где: Екатеринбург/Асбе ст

Репутация: 1
Всего: 1



DeMoNN, 

пишет же:
Код

at Game.redrawScreen(+68)

не тот кусок кода вы приводите
надо смотреть redrawScreen в 68 строке. скорее всего идет обращение к не созданному обьекту


Это сообщение отредактировал(а) mopsa - 5.4.2009, 10:50
PM MAIL   Вверх
math64
Дата 5.4.2009, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



+68 не 68 строка, а 68 байт в байт-коде. Нужно перекомпилировать, включив информацию о номерах строк
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0663 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.