Изображение не загружается, получая недопустимый ввод исключения аргумента == null

Я пытаюсь загрузить изображение в игру, которую только начал создавать, но когда я это делаю, возникают проблемы с поиском моего изображения, как показано ниже:

`Exception in thread "Thread-0" java.lang.IllegalArgumentException: input == null!
    at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1400)
    at me.louisnathan.game.gfx.ImageLoader.loadImage(ImageLoader.java:12)
    at me.louisnathan.game.Game.init(Game.java:32)
    at me.louisnathan.game.Game.run(Game.java:60)
    at java.base/java.lang.Thread.run(Thread.java:834)`

Изображение находится в папке с именем текстуры, которая находится в другой папке с именем res. Папка res была добавлена ​​в путь сборки. Мое изображение называется image.png. Изображение сделано в фотошопе.

Мой код:

Класс игры

public class Game implements Runnable {

public int width, height;
public String title;

private Display display;
private Thread thread;
private BufferStrategy bs;
private Graphics g;
private BufferedImage image;

private boolean isRunning = false;

public Game(String title, int width, int height) {
    this.width = width;
    this.height = height;
    this.title = title;
}

private void init() {
    display = new Display(title, width, height);
    image = ImageLoader.loadImage("/textures/image.png");
}

private void tick() {

}

private void render() {
    bs = display.getCanvas().getBufferStrategy();

    if (bs == null) {
        display.getCanvas().createBufferStrategy(3);
        return;
    }

    g = bs.getDrawGraphics();
    // Clearing Screen
    g.clearRect(0, 0, width, height);
    // Start Rendering



    // End Rendering
    bs.show();
    g.dispose();
}

public void run() {
    init();

    while (isRunning) {
        tick();
        render();
    }
}

public synchronized void start() {
    if (isRunning)
        return;
    isRunning = true;
    thread = new Thread(this);
    thread.start();
}

public synchronized void stop() {
    if (!isRunning)
        return;
    isRunning = false;
    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

}

Класс ImageLoader

public class ImageLoader {

public static BufferedImage loadImage(String path) {
    try {
        return ImageIO.read(ImageLoader.class.getResource(path));
    } catch (IOException e) {
        e.printStackTrace();
        System.exit(1);
    }
    return null;
}
}

comment
где в вашем проекте /textures/image.png находится?   -  person Jens    schedule 29.09.2018
comment
в моей папке res, которая была добавлена ​​​​в путь сборки   -  person Louis    schedule 29.09.2018
comment
Вы передаете абсолютный путь к loadImage. Попробуйте относительный путь, но вам может понадобиться немного больше работы с ним, потому что я знаю, что при работе с ресурсами в Java требуется некоторое волшебство - одна из тех вещей, которые легче переборщить, пока они не заработают, а не изучать, как правильно с ними работать :-)   -  person RWRkeSBZ    schedule 29.09.2018
comment
Извините, а как именно это сделать? Я не знаком с путями и ресурсами...   -  person Louis    schedule 29.09.2018
comment
which has been added to the build path - не знаю, какой путь сборки, но изображения должны быть найдены в вашем пути к классам. I'm not to familiar with paths and resources — возможно, раздел из руководства Swing по Загрузка изображений с использованием ресурсов поможет. Я не использую ведущий /.   -  person camickr    schedule 29.09.2018
comment
Волшебство @RWRkeSBZ? неужели?   -  person Antoniossss    schedule 29.09.2018
comment
@Antoniossss Просто пытаюсь пошутить. У меня никогда не получается с первой попытки. Обычно это требует отладки печати больше, чем необходимо.   -  person RWRkeSBZ    schedule 30.09.2018
comment
Там нет ничего волшебного - просто нужно помнить, что оно начинается с /   -  person Antoniossss    schedule 30.09.2018


Ответы (1)


Этот оператор ImageLoader.class.getResource(path) возвращает null.

Проверьте сгенерированный JAR (вы можете открыть его как любой ZIP-архив) или выходной каталог классов (если работаете из IDE), если файл image.png находится в каталоге textures.

person Antoniossss    schedule 29.09.2018
comment
Именно то, что я имел в виду в своем комментарии выше: необходимость копаться в файле JAR, чтобы выяснить, где находится ресурс :-) - person RWRkeSBZ; 30.09.2018
comment
Где/как проверить сгенерированный файл jar. Image.png определенно находится в моей папке с текстурами, это точно. - person Louis; 30.09.2018
comment
Да, это точно в папке res/textures. - person Louis; 01.10.2018
comment
может ли это быть как-то связано с настройкой пути сборки в пути к модулю или пути к классам? - person Louis; 01.10.2018
comment
@Louis, может быть, тогда это должно быть /res/textures/? Трудно сказать, не видя структуру каталогов проекта. - person Antoniossss; 01.10.2018
comment
Нет, потому что res добавлен в путь сборки, поэтому мне это не нужно. Это действительно сложно. У меня действительно никогда не было такой проблемы раньше. Я чувствую, что это может иметь какое-то отношение к последней версии eclipse. - person Louis; 01.10.2018
comment
Нет, потому что res добавляется в путь сборки, поэтому мне это не нужно и что? Какое отношение к этому имеет путь сборки? Если в JAR вы получили /res/whatver/yourseruse, то это путь к ресурсу. - person Antoniossss; 01.10.2018