2009-03-09 16 views
9

tengo esta aplicación de prueba:Java - getClassLoader() getResource() me está volviendo loco

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

    } 
} 

Cuando lo ejecuto desde Eclipse, me sale el error:

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

de rutas de clases (de .classpath archivo)

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

En mi c: \ proyecto carpeta \ src, que tiene sólo el archivo Test.java y el directorio 'activos' que contiene pacman.png.

¿Qué estoy haciendo mal y cómo resolverlo?

Respuesta

7

lo haría de esta manera:

final InputStream stream; 

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

"/assets/pacman.png" es una ubicación absoluta whle "activos /pacman.png "es una ubicación relativa.

+0

Su código da el resultado "Stream = null" :( –

+0

como se esperaba, dado que los otros intentos no funcionaron. ¿Cuál es el paquete en el que están las clases, dónde está el archivo .class ubicado? – TofuBeer

+0

La .class se coloca en c: \ java \ test \ bin cuando presiono ejecutar en eclipse. La .java está en c: \ java \ test \ src y la carpeta assets/también está en este directorio. Ningún paquete en este momento porque estoy tratando de hacer que funcione para mi otro proyecto. Gracias –

17

No necesita la barra al comienzo cuando obtiene un recurso de ClassLoader, porque no hay idea de una parte "relativa" para empezar. Solo lo necesita cuando obtiene un recurso de un Class donde las rutas relativas van desde el nivel del paquete de la clase.

Además, usted no quiere Test.class.getClass() como que tiene la clase de Test.class, que será Class<Class>.

En otras palabras, pruebe una de estas líneas:

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

Gracias. Intenté ambos, pero no funciona, sin embargo, ahora da una excepción en la línea 10 (que es la primera línea system.out.println) en lugar de la línea 9. Me he asegurado y la imagen está en project/src/activos ... –

+0

que indica que "algunos" es nulo ... lo que significa que no está obteniendo el recurso correctamente. – TofuBeer

+0

sí, entonces ¿cómo puedo resolverlo? es el classpath incorrecto o algo más que necesito cambiar? –

4

Haga clic Upvote,

  • Cuando se utiliza .getClass().getResource(fileName) que considera la ubicación del nombre de archivo es el mismo lugar de la clase de la llamando.
  • Cuando se utilice .getClass().getClassLoader().getResource(fileName) que considera la ubicación del nombre de archivo es la raíz - en otras palabras, la carpeta bin

Se golpea NullPointerException si el archivo es en realidad no existe allí.

Fuente:

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

de salida;

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

Esto funciona para mí:

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

la que los activos en la misma carpeta con el archivo de salida Test.class (después de una comprobación miserable y depuración)

Cuestiones relacionadas