Исключение незаконного аргумента, выданное ImageIO.read - PullRequest
0 голосов
/ 03 июля 2018

В основном я пытаюсь загрузить некоторые данные изображения в java как объект ImageIcon. Первоначально я попытался просто сделать ImageIcon image = new ImageIcon (имя файла), но это сделало так, чтобы изображения не загружались при экспорте в файл JAR. Новый способ, которым я это сделал, выглядит так:

private static ImageIcon getImage(String filename) {
    try {
        URL url = PacMan.class.getResource(filename);
        Image image = ImageIO.read(url);
        return new ImageIcon(image);
    }
    catch (IOException e) {
        e.printStackTrace();
    }

    return null;
}

Ошибка в том, что PacMan.class.getResource (filename) возвращает ноль. Моя директория такова, что мой класс PacMan находится в src / Model / PacMan, и мои изображения имеют следующие пути к файлам:

src/Model/PacMan_Images/PacMan_EAST, 
src/Model/PacMan_Images/PacMan_SOUTH, 
src/Model/PacMan_Images/PacMan_WEST, 
src/Model/PacMan_Images/PacMan_NORTH. 

Кроме того, я попытался вернуться к использованию нового ImageIcon (filepath), и изображение загружается нормально, поэтому я знаю, что изображение существует в моем каталоге. Кто-нибудь знает в чем может быть проблема?

Изменить: Моя ошибка в том, что я получаю исключение IllegalArgumentException, потому что я передаю ноль в качестве параметра для ImageIO.read (url), потому что URL-это ноль.

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Ошибка состояла в том, что я передавал в качестве моего имени файла Model / PacMan_Images / PacMan_EAST вместо / Model / PacMan_Images / PacMan_EAST. Оказывается, что экстра / действительно имеет значение. Спасибо @MadProgrammer за помощь, @ paulsm4 с дополнительными ресурсами и всем, кто прокомментировал.

0 голосов
/ 03 июля 2018

Я был бы удивлен, если бы корневой путь "/ src" был действительно импортирован в ваш .jar. Пожалуйста, попробуйте это:

  1. Загляните внутрь .jar. Например, используйте 7Zip , чтобы увидеть фактический путь к вашим файлам.

  2. Попробуйте изменить имя файла на «Model / PacMan_Images / PacMan_EAST».

  3. Подробнее об Java смотрите здесь getResource ():

http://www.novixys.com/blog/read-file-resources-folder-java/

https://docs.oracle.com/javase/8/docs/technotes/guides/lang/resources.html

Java Swing: отображение изображений внутри Jar

ДОПОЛНЕНИЕ:

  1. Я бы скачал 7-Zip и проверил ваш файл .jar, чтобы ознакомиться с форматом. Это просто файл .zip ... но часто полезно понять, что внутри него, и иметь возможность изменить его (хотя бы для устранения неполадок).

  2. Вот отличное обсуждение «Class.getResource» (который может принимать «относительное» имя ресурса) против «абсолютного ресурса» (который ДОЛЖЕН иметь начальную косую черту):

В чем разница между Class.getResource () и ClassLoader.getResource ()?

  1. Наконец, вот одно из предложений по рефакторингу вашего кода, чтобы избежать предупреждения компилятора:

    private static ImageIcon getImage(String filename) {
        ImageIcon imageIcon = null;
        try {
            URL url = PacMan.class.getResource(filename);
            Image image = ImageIO.read(url);
            imageIcon = new ImageIcon(image);
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        return imageIcon;
    }
    

Существует много других опций, в том числе просто отключение этого конкретного предупреждения (например, @SuppressWarnings).

...