2015-06-25 2 views
-2

Я получаю NullPointerException при запуске кода ниже. Я не знаю, почему я это получаю, и это мешает мне развиваться дальше.Java: NullpointerException by

MyImage.java:

import java.awt.Image; 
import java.awt.Toolkit; 

public class MyImage { 

    private String name; 
    private Image img = null; 

    public MyImage(String n) { 
     this.name=n; 
    } 

    public Image get() { 
     if (img == null) { 
      img = Toolkit.getDefaultToolkit() 
         .createImage(getClass() 
         .getClassLoader() 
         .getResource(name)); 
     } 
     return (img); 
    } 
} 

PaintableImage.java:

package name.burre.jan.animationGame; 

import java.awt.Graphics; 
import javax.swing.JPanel; 

public class PaintableImage extends JPanel implements Paintable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    MyImage mi; 

    public PaintableImage (MyImage m) { 
     this.mi = m; 
    } 

    public PaintableImage(String name) { 
     this.mi = new MyImage(name); 
    } 

    @Override 
    public void paintTo(Graphics g) { 
     g.drawImage(mi.get(),0,0,this); 
    } 

    public static void main (String[] args) { 
     PaintableImage pi = new PaintableImage("img/Flower.jpg"); 
     System.out.println(pi.mi.get().getHeight(pi)); 
    } 
} 

Мои MyImage.class и мой PaintableImage.class ют в одной папке, и в этой папке лежит IMG-папку, где мой Flower.jpg находится. Любые предложения?

+7

Просьба представить полное сообщение об исключении. – Turing85

+0

Трассировка стека будет очень полезна. – rodit

+0

Мое предположение без stacktrace заключается в том, что оно не находит изображение на 'img/Flower.jpg'. Это приводит к тому, что ваш 'get()' возвращает null (или, возможно, выдает сам NPE), что затем вызывает g.drawImage() ', чтобы выбросить NPE. Но stacktrace действительно поможет. – user489041

ответ

1

Null указатель ошибки вы столкнулись должны быть на этой линии

img = Toolkit.getDefaultToolkit() 
         .createImage(getClass() 
         .getClassLoader() 
         .getResource(name)); 

Это происходит потому, что он не может найти файл flower.jpg. Когда вы получаете getClassLoader(). GetResource (name), он ищет папку img в корневом каталоге, где находятся файлы классов.

Вы можете увидеть пример ниже, чтобы лучше понять

Source

package Sound; 
public class ResourceTest { 
    public static void main(String[] args) { 
     String fileName = "Kalimba.mp3"; 
     System.out.println(fileName); 
     System.out.println(new ResourceTest().getClass().getResource(fileName)); 
     System.out.println(new ResourceTest().getClass().getClassLoader().getResource(fileName)); 

Выхода

Kalimba.mp3 
file:/C:/Users/User/Workspaces/MyEclipse%208.5/JMplayer/bin/Sound/Kalimba.mp3 
file:/C:/Users/User/Workspaces/MyEclipse%208.5/JMplayer/bin/Kalimba.mp3 
    } 
} 

Got пример здесь - Java - getClassLoader().getResource() driving me bonkers

Надеется, что это помогает.

Переместите папку изображений в корневую директорию, где находятся файлы классов, чтобы найти это - вы можете сделать печать, как указано выше.

Пример - если его веб-проект, классы будут проходить под web-inf/classes, поэтому вы должны поместить свою папку img в папку классов.

+1

Отметить как ответ (Тик), если он будет разрешен с помощью вышеуказанных входов –

+0

Спасибо. Моя проблема действительно была в местоположении моей img-Folder. Проблема, с которой я столкнулась, что книга, которую я изучаю, не объясняет точного значения корневой папки моих классов. Поэтому, благодаря вашему примеру, я могу продолжить. :) – BlackFool

+0

Приятно слышать, но со следующего раза - Выясните ошибку со следом. Таким образом, вы можете решить проблему намного быстрее. –