2015-01-01 2 views
0

У меня проблема с файлом jar. Когда я запускаю проект в NetBeans, все работает нормально. Но когда я запускаю его как файл фляги я получил Null Pointer Exception в этой функции:Jar-файл не работает, как в NetBeans

public void setBg(int w, int h){ 

    BufferedImage bgg = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
    Graphics g = bgg.getGraphics(); 
    for(int i = 0; i < board.getHeight(); ++i){ 
       for(int j = 0; j < board.getWidth(); ++j){ 
        g.drawImage(board.getBoardElement(j, i).getImage().getScaledInstance(element_w, element_h, Image.SCALE_SMOOTH), ((j*element_w)), ((i*element_h)), this); 
       System.out.println(j+" "+i); 
       } 
      } 

    bg=bgg; //it's important to not blinkink map while it's drawing 
} 

Everytime при запуске приложения с помощью баночки переменных I и J имеет различные значения, когда происходит NullPointerException. Что может быть причиной?

+0

Вы пытались инкапсулировать метод в try-catch и распечатывать трассировку стека для исключения? – Dawnkeeper

+0

Добавьте свои фотографии в папку src, затем выполните очистку и сборку и попробуйте еще раз – StasKolodyuk

ответ

4

Начните с добавления в некоторые операторы отладки (System.out.println или используйте API регистрации, например log4j или встроенный API ведения журнала) в своем коде, чтобы проверить состояние различных переменных и определить выполняемый порядок кода.

Добавить контрольные точки в свой код и использовать отладчик для перехода по вашему коду и проверки состояния различных переменных и логики вашего кода.

Я «угадать», что вы получаете исключение, потому что board.getBoardElement(j, i).getImage() возвращается null, потому что вы загрузите изображение, используя что-то вроде ImageIcon(String), но файлы изображений либо поддерживается в контексте файла Jar или вы не погрузил их от относительного расположения с диска, и они больше не доступны из текущих Фляг расположения

Start, убедившись, что ваши изображения хранятся в src директории вашего проекта Netbeans, предположительно в подпрямо как resources/images или некоторых такие

Далее, используйте ImageIO.read, чтобы загрузить ваши изображения, это вызовет ошибку IOException, если изображение по какой-либо причине не может быть загружено (другое не работает как ImageIcon). См. Reading/Loading an Image для более подробной информации.

Далее используйте Class#getResource для загрузки изображений ...

BufferedImage img = ImageIO.read(getClass().getResource("/resources/images/NameOfImage.jpg")); 
+0

О, Боже, я забыл изменить это в некоторых классах. Спасибо, что сэкономил мое время! –

0

Обратите внимание, что файл банка содержится в каталоге с именем «расстояние», где в качестве корневого каталога выполнения через NetBeans является верхний каталог «расстояние». Следовательно, любая ссылка на пути к файлам будет отличаться в зависимости от того, выполняете ли вы программу из NetBeans или запускаете файл jar.

+0

На самом деле, я понял, что не внимательно прочитал ваш вопрос ... Мой плохой. –

0

Как вы не упоминаете точное место, которое трассировка стека будет указывать на со списком (источник + номер строки + метод), я предполагаю, что это:

g.drawImage(board.getBoardElement(j, i).getImage() ... 

Как отмечает MadProgrammer, прочитайте изображения с Class.getResource или Class.getResourceAsStream. Путь относится к пакету класса или абсолютному "/....". Важно то, что хотя пути к файлам в Windows чувствительны к регистру, в других операционных системах и в банках они чувствительны к регистру.

Также позвоните g.dispose() после createGraphics соответственно. getGraphics (что то же самое, с более старым именем).

Graphics g = bgg.getGraphics(); 
... 
g.dispose(); 
Смежные вопросы