Configurando una imagen me está devolviendo nulo como entrada cuando debería ser una imagen.
Estoy teniendo esta impresión en mi consola cuando falla:
java.lang.IllegalArgumentException: input == null!
at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1402)
at com.cRS.crRS.graphics.Texture.loadBitmap(Texture.java:14)
at com.cRS.crRS.graphics.Texture.<clinit>(Texture.java:9)
at com.cRS.crRS.graphics.Render3D.floor(Render3D.java:75)
at com.cRS.crRS.graphics.Screen.render(Screen.java:27)
at com.cRS.crRS.Display.render(Display.java:185)
at com.cRS.crRS.Display.run(Display.java:144)
at java.base/java.lang.Thread.run(Thread.java:833)
No entiendo por qué este código está fallando y no funcionando.
He agregado / res / como un camino de compilación de Java. / res / está junto a / src / en el directorio de archivos.
/res/textures/floor.png
paquete com.cRS.crRS.graphics;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
public class Texture {
public static Render floor = loadBitmap("/textures/floor.png");
public static Render loadBitmap(String fileName) {
tratar {
BufferedImage image = ImageIO.read(Texture.class.getResource(fileName));
int width = image.getWidth();
int height = image.getHeight();
Render result = new Render(width, height);
image.getRGB(0, 0, width, height, result.pixels, 0, width);
return result;
} captura (Excepción e) {
System.out.println("¡¡CRASH!!!");
e.printStackTrace();
lanzar nueva RuntimeException(e);
}
}
}
El programa falla cuando uso esta línea en una clase diferente
pixels[x + y * width] = Texture.floor.pixels[(xPix & 7) + (yPix & 7) * 8];
Para evitar fallos, no uso Texture.java en absoluto, pero quiero hacerlo.
davy.ai
Basado en el mensaje de error, parece que el método
ImageIO.read()
está arrojando unaIllegalArgumentException
porque el parámetro de entrada esnull
. Esto significa que el archivo o la ruta de recurso que estás intentando leer no se encuentra o es inválido.Observando el método
loadBitmap()
en la claseTexture
, la ruta de archivo se construye utilizando el métodogetResource()
desde el objetoTexture.class
, lo que significa que la ruta de archivo es relativa a la raíz del classpath. En este caso, la ruta de archivo es"/textures/floor.png"
, lo que debería corresponder a un archivo llamadofloor.png
ubicado en un directorio llamadotextures
en la raíz del classpath.Como has agregado
/res/
como ruta de construcción, es posible que la raíz del classpath no esté al mismo nivel que las carpetassrc
yres
, lo que puede estar causando que la ruta de archivo sea incorrecta.Para verificar la ruta de archivo correcta, puedes intentar imprimir el resultado de
Texture.class.getResource(fileName)
y ver si corresponde con la ubicación actual del archivo. También puedes intentar usar una ruta de archivo absoluta en lugar de una relativa para asegurarte de que la ubicación del archivo es correcta.Si la ubicación del archivo es verdaderamente correcta, entonces el error puede ser causado por un archivo de imagen corrupto o inválido. Puedes intentar abrir el archivo manualmente para ver si se puede abrir con un editor o visualizador de imágenes.
En cualquier caso, si el método
ImageIO.read()
arroja una excepción, el bloquecatch
en el métodoloadBitmap()
imprimirá un mensaje y volverá a arrojar la excepción como unaRuntimeException
, lo que causará que el programa se bloquee. Quizás desees manejar la excepción con más elegancia devolviendo una imagen predeterminada o de relleno en lugar de bloquear el programa.