2010-11-29 19 views
33

Estoy utilizando lo siguiente para obtener la URL de este archivo en particular, pero devuelve nulo. ¿Alguien tiene alguna sugerencia sobre el problema o una forma alternativa de hacerlo?Java - class.getResource devuelve nulo

URL url = ExchangeInterceptor.class.getResource("GeoIP.dat"); 

Respuesta

4

No, esa es la manera correcta de afaik. Asegúrate de que el recurso esté en tu classpath. Esto a menudo es la causa de este tipo de problemas.

25

La ruta de acceso es relativa a la raíz de la ruta de clase y si no proporciona una ruta absoluta, está buscando en el mismo paquete que la clase que está utilizando (en este caso ExchangeInterceptor). Para encontrar algo en la raíz, use /GeoIP.dat.

+2

Esta es realmente la respuesta. Todo lo demás es un poco absurdo. Excepto tal vez por la pista de IntelliJ. – Schultz9999

1

¿Dónde has puesto este GeoIP.dat? En el mismo paquete que ExchangeInterceptor, o en el paquete "raíz". Si está en el mismo paquete, su código es correcto, si está en la raíz, agregue el prefijo '/'.

¿Tal vez está usando M2Eclipse? Si se configura incorrectamente, también puede provocar tales problemas. Otra causa de este tipo de problemas puede ser: cargadores de clases mal configurados, OSGi mal configurado, ...

2

Por si alguien todavía tiene problemas para entender que:

.getResource() le otorga acceso a la carpeta bin local. Eso significa que sus recursos deben estar ubicados en YourProject/bin/package /. La carpeta raíz es YourProject/bin/y puede ser accedida agregando el prefijo/al argumento String, como dijo iirekm.

+3

No apunta a una carpeta específica en absoluto. Simplemente apunta a la ruta de clase. Debería verlo al revés: la carpeta bin de la que está hablando es parte del classpath en tiempo de ejecución. – BalusC

+0

, también intenté usar el mismo método y obtuve el mismo error que en el póster original. Lo arreglé agregando los archivos a las rutas que mencioné, así que pensé que debería compartir este "descubrimiento" – merovin

+2

Acabas de descubrir una de las rutas de la ruta de clases. OP ya lo tiene en el classpath, OP acaba de acceder a él con la ruta incorrecta. – BalusC

-2

Primero, debe asegurarse de que está accediendo al archivo correcto en el camino correcto. Puede verificarlo por getClass(). GetResource ("GeoIP.dat"). GetAbsolutePath().

En segundo lugar, el especificador de ruta distingue entre mayúsculas y minúsculas, así que asegúrese de que su archivo no se llame "geoIP.dat" o "GeoIP.DAT".

+2

Obtendrás NullRef porque 'getResource' devuelve' null', ¿recuerdas? – Schultz9999

36

Para quienes usan Intellij Idea: verifique Configuración -> Compilador -> Patrones de recursos.

La configuración contiene todas las extensiones que deben interpretarse como recursos. Si una extensión no cumple con ningún patrón aquí, class.getResource devolverá nulo para recursos usando esta extensión.

+1

He estado usando IDEA por más de 10 años y nunca supe de esta configuración. ¡Gracias! –

+7

Esta respuesta no es aplicable a los proyectos de Maven – Sam

+0

@Sam ¿Cuál sería la solución para los proyectos de maven? – maja

1

El archivo tiene que estar en la ruta de clase, por ejemplo .: -

bin/mi/paquete/GeoIP.dat

El/prefijo parece ser una mentira. Lo siguiente funcionaría.

URL url = ExchangeInterceptor.class.getResource("my/package/GeoIP.dat"); 

Sospecho que el problema es que no tiene el archivo en el classpath.

14

utilizan el método de la clase ClassLoader

URL url = ExchangeInterceptor.class.getClassLoader().getResource("GeoIP.dat"); 
+3

Esto funcionó para mí ... ¿Por qué? – Maarten

+1

[Es por eso que funcionó] (http://stackoverflow.com/a/13292358/3843101) – Jimeh

-3

getResource En caso de Eclipse.

Solo una pista. Su código podría ser correcto, pero su configuración jre no. Me encontré con el mismo error, nada me ayudó, hasta que verifiqué la configuración del eclipse.

Asegúrese de configurar el entorno de ejecución correcto.

Preferences -> Java -> Installed JREs -> use "jdk..." as compatible JRE 
+0

Esto realmente no aborda la pregunta original o explica por qué ayudaría con el problema de OP. –

4

Resolví este problema señalando el resource root en IDEA.

Inicialmente el directorio fue así, y el icono fue un icono de la carpeta sin formato

Antes

enter image description here

Right click en un directorio (o simplemente el nombre del proyecto) ->Mark directory As ->Resource Root .

Después de

after

Recompile & rejoice: P

0

Durante el uso de IntelliJ, I genera el proyecto como una aplicación JavaFX y después se añadió experto marco de apoyo a la misma. Resulta que, luego coloqué mi recurso en src/main/resources y tuve que agregar ./ detrás de cada nombre de recurso que al usarlos en el código.

También como se indicó en una respuesta anterior, solo se cargó el recurso por un classLoader funcionó.

Así que para mí, la carga de la URL final se hizo usando:

URL url = getClass().getClassLoader().getResource(String.format(".%ssample.fxml", File.separatorChar));

Los rendimientos File.separatorChar/ en * nix y \ en las ventanas.

1

Si está utilizando Gradle y IntelliJ, y cambiar Resource patterns no funcionó, y sus raíces recursos están correctamente ... se puede probar esto:

enter image description here

Settings > Build, Execution, Delpoyment > Build Tools > Gradle > Runner > Delegate IDE build/run actions to gradle . (IntelliJ 03/03/2017)

Fuente: https://youtrack.jetbrains.com/issue/IDEA-176738#comment=27-2518612

Cuestiones relacionadas