2009-03-09 10 views
9

mam tę aplikację testową:Java - getClassLoader() getResource() doprowadza mnie bonkers

import java.applet.*; 
import java.awt.*; 
import java.net.URL; 
public class Test extends Applet 
{ 

    public void init() 
    { 
     URL some=Test.class.getClass().getClassLoader().getResource("/assets/pacman.png"); 
     System.out.println(some.toString()); 
     System.out.println(some.getFile()); 
     System.out.println(some.getPath()); 

    } 
} 

Kiedy uruchomić go z Eclipse, otrzymuję błąd:

java.lang.NullPointerException 
    at Test.init(Test.java:9) 
    at sun.applet.AppletPanel.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

Classpath (od plik .CLASSPATH)

<classpathentry kind="src" path="src"/> 

W moim C: \ projekt folderu \ src, mam tylko plik Test.java i katalog 'Aktywa', który zawiera pacman.png.

Co robię źle i jak rozwiązać problem?

Odpowiedz

7

zrobiłbym to w ten sposób:

final InputStream stream; 

stream = Test.class.getResourceAsStream("assets/pacman.png"); 
System.out.println("Stream = " + stream); 

"/assets/pacman.png" to absolutna lokalizacja whle „aktywa /pacman.png "jest względną lokalizacją.

+0

Twój kod daje wynik "Stream = null" :( –

+0

zgodnie z oczekiwaniami, zważywszy że inne próby nie zadziałały.Jakie są pakiety, w których znajdują się klasy, gdzie jest plik .class znajduje się? – TofuBeer

+0

.class jest umieszczany w c: \ java \ test \ bin, gdy uderzę uruchomić w eclipse. .java znajduje się w c: \ java \ test \ src i folder assets/jest również w tym katalogu Brak pakietu Używam go teraz, ponieważ próbuję tylko sprawić, żeby działało dla mojego innego projektu. Dzięki –

17

Nie musisz mieć ukośnika na początku, gdy pobierasz zasób z ClassLoader, ponieważ nie ma pojęcia "części względnej" na początek. Potrzebujesz go tylko wtedy, gdy otrzymujesz zasób z Class, gdzie ścieżki względne idą z poziomu pakietu klasy.

Ponadto, nie chcesz Test.class.getClass() jako że dostaje klasę z Test.class, który będzie Class<Class>.

Innymi słowy, spróbuj jednej z tych linii:

URL viaClass=Test.class.getResource("/assets/pacman.png"); 
URL viaLoader=Test.class.getClassLoader().getResource("assets/pacman.png"); 
+0

dzięki. Próbowałem obu, ale to nie działa, jednak teraz daje wyjątek na linii 10 (która jest pierwszą linią system.out.println) zamiast linii 9. Upewniłem się, że obraz jest w projekcie/src/asset ... –

+0

który mierzy, że "some" ma wartość null ... co oznacza, że ​​nie dostajesz odpowiedniego zasobu. – TofuBeer

+0

tak, więc jak mogę to rozwiązać? czy ścieżka klasy jest niepoprawna, czy coś innego muszę zmienić? –

4

Kliknij upvote,

  • Podczas korzystania .getClass().getResource(fileName) to uważa lokalizacja pliku jest taka sama lokalizacja z wywołującego klasie.
  • Podczas korzystania .getClass().getClassLoader().getResource(fileName) to uważa lokalizacja pliku jest root - innymi słowy folderu bin

uderza ona NullPointerException jeśli plik jest faktycznie nie istnieją.

Źródło:

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)); 

wyjściowego;

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 
    } 
} 
1

Działa to dla mnie:

URL viaClass=Test.class.getResource("assets/test.html");

których aktywa w tym samym folderze co plik wyjściowy Test.class (po nędznej sprawdzania i debugowania)

Powiązane problemy