es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Basado en el mensaje de error, parece que el método ImageIO.read() está arrojando una IllegalArgumentException porque el parámetro de entrada es null. 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 clase Texture, la ruta de archivo se construye utilizando el método getResource() desde el objeto Texture.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 llamado floor.png ubicado en un directorio llamado textures 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 carpetas src y res, 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 bloque catch en el método loadBitmap() imprimirá un mensaje y volverá a arrojar la excepción como una RuntimeException, 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.

Comments are closed.