NullPointerException при выполнении файла Jar. Ничего не работает - PullRequest
0 голосов
/ 30 апреля 2018

Я чувствую, что перепробовал все. Вот некоторые примеры кода, который я пробовал, который прекрасно работает внутри IDE, но как только он упакован в файл jar, он разваливается. Каждый файл находится на одном уровне и упакован в файл JAR. Я открываю его с помощью WinRar и вижу, что изображение «c3.png» абсолютно внутри, прямо рядом с моим главным классом, в корне Jar.

C3 = new ImageIcon( getClass().getResource("c3.png") );

.

C3 = new ImageIcon( this.getClass().getResource("c3.png") );

.

C3 = new ImageIcon( ImageIO.read( getClass().getResource("c3.png") );

.

C3 = new ImageIcon( ImageIO.read( ClassLoader.getSystemClassLoader().getResourceAsStream( "c3.png" ) ) );

.

C3 = new ImageIcon( ImageIO.read( getClass().getClassLoader().getResource( "C3.png" ) ) );

edit: Я пробовал еще несколько, которые ... конечно ... не удалось.

C3 = new ImageIcon(VP2CPConverter.class.getResource("/C3.png"));

.

C3 = new ImageIcon( VP2CPConverter.class.getClassLoader().getResource( "C3.png" ) );

В короткой попытке устранения неполадок я даже попытался getResourceAsStream (), чтобы выяснить каждый ресурс, доступный при выполнении Jar-файла. Внутри IDE все они. В банке ... НИКОГО из них.

Кто-нибудь застрелит меня сейчас.

1 Ответ

0 голосов
/ 01 мая 2018
C3 = new ImageIcon( getClass().getResource("c3.png") );
C3 = new ImageIcon( this.getClass().getResource("c3.png") );

Эти два идентичных, и предполагают, что ресурс присутствует в папке, представленной именем пакета текущего класса. Очевидно, это не так.

C3 = new ImageIcon( ImageIO.read( getClass().getResource("c3.png") );

Это делает то же самое предположение.

C3 = new ImageIcon( ImageIO.read( ClassLoader.getSystemClassLoader().getResourceAsStream( "c3.png" ) ) );

Предполагается, что ресурс присутствует в корневой папке файла JAR. Очевидно, это не так.

C3 = new ImageIcon( ImageIO.read( getClass().getClassLoader().getResource( "C3.png" ) ) );

Это делает то же самое предположение.

C3 = new ImageIcon(VP2CPConverter.class.getResource("/C3.png"));

Это делает то же самое предположение.

C3 = new ImageIcon( VP2CPConverter.class.getClassLoader().getResource( "C3.png" ) );

Это делает то же самое предположение.

Ясно, что все вышеизложенные предположения неверны. Поэтому сделайте одно из них истинным и используйте соответствующий код, который предполагает это. Если вы хотите получить ресурс через текущий класс, поместите его в пакет текущего класса. Если вы хотите получить его через загрузчик классов или путь, начинающийся с /, поместите его в корневой каталог файла JAR.

...