Java: NullPointerException de class.getResource(…)

5 minutos de lectura

avatar de usuario
Martín Tuskevicius

Estaba escribiendo una aplicación pequeña y cuando traté de 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, la carpeta /icons/ existe. 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 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 mi jerarquía de carpetas:

Jerarquía de carpetas

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

Edición 2:

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

Imprime verdad.

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

    – posdef

    16 mayo 2011 a las 20:36

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

    –Nate W.

    16 mayo 2011 a las 20:49

  • 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 ‘icons’.

    – Martín Tuskevicius

    16 mayo 2011 a las 20:52


  • ¿Está la carpeta de iconos en el classpath cuando se ejecuta la aplicación?

    – mate b

    16 mayo 2011 a las 23:48

  • El NPE no es de Class.getResource(), contrario a su título. Es el resultado de su fracaso para comprobar el resultado.

    – usuario207421

    11 de noviembre de 2016 a las 9:46

avatar de usuario
Nate W.

Creo que la NPE está siendo arrojada desde el ImageIcon constructor como getResource esta regresando null.

Prueba lo siguiente:

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

O:

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

  • Probé getClass().getClassLoader().getResource(“/icons/icon_prayer.png”), sin cambios

    – Martín Tuskevicius

    16 mayo 2011 a las 20:44


  • @Martin Tuskevicius: Agregué otro método de recuperación: ¡pruébalo!

    –Nate W.

    16 mayo 2011 a las 21:03

avatar de usuario
Posdef

Por lo que sé getResource() buscará en las ubicaciones de los 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, que yo sepa:

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 ícono como un archivo normal sin usar getResource() método. Esto es realmente aconsejado en Tutoriales de Swing sobre documentación propia de Sun/Oracle .

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

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

Espero que esto ayude, buena suerte!

Hilo antiguo, pero como me encontré con un problema similar hace un momento …

Estoy usando Eclipse y copié un archivo en la carpeta “recursos” usando los comandos del sistema (cp). Sin embargo, el eclipse lanzó un NullPointerException porque no actualicé la carpeta “recursos”. Entonces 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ó.

  • La misma solución aquí para IntelliJ IDEA: Build->”Rebuild project” funcionó.

    – horrocrux

    15 dic 2021 a las 19:45

avatar de usuario
Valencia Starr

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 establecer el icono de la imagen.

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

  • Esto no es cierto. el constructor ImageIcon(URL) lanzará 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.

    16 mayo 2011 a las 20:41

  • Pero entonces la NullPointerException no es causada (directamente) por esta línea, sino por alguna línea del constructor.

    – Roland Illig

    16 mayo 2011 a las 20:45


  • Ese es un punto discutible. De cualquier manera, esto habría estado claro si el OP hubiera incluido el seguimiento de la pila. Nota para OP: ¡incluya el mensaje de error relevante!

    –Nate W.

    16 mayo 2011 a las 20:48

  • La URL proporcionada como argumento para el constructor es nula.

    – Martín Tuskevicius

    16 mayo 2011 a las 20:50

  • Tiene razón, de ahí la NPE de la ImageIcon constructor.

    –Nate W.

    16 mayo 2011 a las 21:04

  • Esto no es cierto. el constructor ImageIcon(URL) lanzará 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.

    16 mayo 2011 a las 20:41

  • Pero entonces la NullPointerException no es causada (directamente) por esta línea, sino por alguna línea del constructor.

    – Roland Illig

    16 mayo 2011 a las 20:45


  • Ese es un punto discutible. De cualquier manera, esto habría estado claro si el OP hubiera incluido el seguimiento de la pila. Nota para OP: ¡incluya el mensaje de error relevante!

    –Nate W.

    16 mayo 2011 a las 20:48

  • La URL proporcionada como argumento para el constructor es nula.

    – Martín Tuskevicius

    16 mayo 2011 a las 20:50

  • Tiene razón, de ahí la NPE de la ImageIcon constructor.

    –Nate W.

    16 mayo 2011 a las 21:04

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad