Java: NullPointerException de class.getResource (…)

Estaba escribiendo una pequeña aplicación y cuando intenté crear un ImageIcon siempre obtuve una excepción. La excepción fue causada por esta línea de código:

prayerLevel.setIcon(new ImageIcon(getClass().getResource("/icons/icon_prayer.png")));

Ahora, dentro de mi programa, existe la carpeta / iconos /. No sé si hace la diferencia, pero el archivo de clase está dentro de un paquete, mientras que la carpeta de iconos está dentro de la carpeta del proyecto (cuando vería la carpeta bin y src).

He buscado un poco a mi alrededor y no pude encontrar una solución que pudiera ayudarme a resolver el problema. ¿Quizás alguno de ustedes podría ayudar?

Editar: alguien preguntó por la jerarquía de mi carpeta:

Jerarquía de carpetas

Sé que el archivo de clase no está en la misma carpeta que los íconos, pero he creado aplicaciones en las que tenía que cargar archivos desde una carpeta diferente y hacer / carpeta / siempre solía funcionar.

Editar 2:

System.out.println(getClass().getResource("/icons/icon_prayer.png") == null);

Imprime verdadero.

preguntado el 16 de mayo de 11 a las 20:05

¿Cómo se ve la jerarquía de carpetas? Cuando dices que existe la carpeta / icons, ¿dónde está exactamente? -

Probablemente debería incluir el mensaje de error relevante, particularmente el seguimiento de la pila, ya que nos mostrará dónde está ocurriendo exactamente el problema. -

Descubrí por qué obtengo el NullPointer, pero ahora no puedo entender por qué class.getResource (...) es nulo. El archivo 'icon_prayer.png' está en la carpeta 'iconos'. -

¿Está la carpeta de iconos en la ruta de clase cuando se ejecuta la aplicación? -

La NPE no es de Class.getResource(), contrario a su título. Es el resultado de su falta de verificación del resultado. -

5 Respuestas

Creo que la NPE está siendo expulsada del ImageIcon constructor como getResource está regresando null.

Intente lo siguiente:

getClass().getClassLoader().getResource("/icons/icon_prayer.png")

o:

ClassLoader.getSystemResource("/icons/icon_prayer.png")

contestado el 17 de mayo de 11 a las 00:05

Intenté getClass (). GetClassLoader (). GetResource ("/ icons / icon_prayer.png"), sin cambios - Martin Tuskevicius

@Martin Tuskevicius: agregué otro método de recuperación, ¡pruébalo! - Nate W.

Por lo que sé getResource() buscará ubicaciones de recursos conocidos, en otras palabras, si la carpeta /icons/ no se ve como una carpeta de recursos, no será como esperaba. Hay dos formas de evitar esto, hasta donde yo sé:

1) Configure la carpeta de iconos como un recurso para la aplicación, luego puede usar getResource() por ejemplo URL css_url = getClass().getResource("/resource/style.css");

Para obtener más información sobre esta opción, consulte http://lj4newbies.blogspot.com/2008/03/using-classgetresource-load-resource.html

2) Obtenga el icono como un archivo normal sin usar getResource() método. En realidad, esto se aconseja en Tutoriales de swing sobre documentación propia de Sun / Oracle .

Generalmente, las aplicaciones proporcionan su propio conjunto de imágenes utilizadas como parte de la aplicación, como es el caso de las imágenes utilizadas por muchas de nuestras demostraciones. Debe usar el método Class getResource para obtener la ruta a la imagen. Esto permite a la aplicación verificar que la imagen está disponible y proporcionar un manejo sensato de errores si no lo está. Cuando la imagen no es parte de la aplicación, getResource no debe usarse y el constructor ImageIcon se usa directamente. Por ejemplo:

ImageIcon icon = new ImageIcon ("images / middle.gif", "un símbolo bonito pero sin sentido");

Espero que esto ayude, buena suerte!

contestado el 18 de mayo de 11 a las 12:05

Agregué mi música, imágenes, etc. a una carpeta agregada a la ruta de compilación. Entonces solo usé

URL url="CurrentClass".class.getClassLoader().getResource("media file name not the path");
setIconImage(new ImageIcon(url.getPath()).getImage());

para configurar el icono de imagen.

respondido 11 nov., 16:12

Esto hizo el truco. Había agregado mi carpeta Resources / data a la ruta de clases, pero solo estaba usando class.getResource en lugar de class.getClassLoader (). GetResource. Lo cual no funciona si está en el paquete predeterminado. - cachondo

Buen artículo para esto está aquí howtodoinjava.com/java/io/read-file-from-resources-folder - qwebek

Hilo antiguo, pero desde que me encontré con un problema similar hace un momento ...

Estoy usando Eclipse y copié un archivo en la carpeta "recursos" usando comandos del sistema (cp). Sin embargo, el eclipse arrojó un NullPointerException porque no actualicé la carpeta "recursos". Así que el archivo estaba allí, pero Eclipse no lo vio.

Entonces, en Eclipse: "Explorador de paquetes" -> "recursos" -> Clic derecho del mouse -> actualizar. Esto me lo arregló.

Respondido 09 ago 16, 17:08

Lo único que puede lanzar un NullPointerException en esta línea de código es el primero ., Lo que significa que prayerLevel es nulo.

contestado el 17 de mayo de 11 a las 00:05

Eso no es cierto. El constructor ImageIcon(URL) arrojará un NPE si la URL proporcionada es nula, ya que la implementación es simplemente: public ImageIcon(URL location) { this(location, location.toExternalForm()); } - Nate W.

Pero entonces la NullPointerException no es causada (directamente) por este línea, sino por alguna línea del constructor. - Roland Illig

Eso es un punto discutible. De cualquier manera, esto habría quedado claro si el OP hubiera incluido el stacktrace. Nota para OP: incluya el mensaje de error correspondiente. - Nate W.

La URL proporcionada como argumento para el constructor es nula. - Martin Tuskevicius

Tienes razón, de ahí la NPE del ImageIcon constructor. - Nate W.

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.