Почему этот код перестал работать после того, как я переключил машины? - PullRequest
0 голосов
/ 11 сентября 2018

Я работал над проектом на Java с использованием Eclipse, который требует загрузки некоторых изображений и их отображения.Сначала я загрузил их следующим образом:

InputStream stream = MyClass.class.getClass().getResourceAsStream("/resources/ui/icons/" + name);
Image img = ImageIO.read(stream).getScaledInstance(size.width, size.height, Image.SCALE_SMOOTH);

И это работало нормально, независимо от того, запускаю ли я его из Eclipse или из исполняемого файла jar.Но недавно я получил новый ноутбук, и когда я попытался запустить его на новом компьютере, банка не работала;stream всегда оказывается null.Однако эта проблема не возникает, когда я работаю из Eclipse.

Наконец, после некоторых экспериментов, я изменил код так, чтобы он вызывал getResourceAsStream() непосредственно на MyClass.class без вызова getClass():

InputStream stream = MyClass.class.getResourceAsStream("/resources/ui/icons/" + name);
Image img = ImageIO.read(stream).getScaledInstance(size.width, size.height, Image.SCALE_SMOOTH);

И по какой-то причине это работает.У моего нового ноутбука та же ОС (Windows 10) и другие настройки, что и у старого, но вместо Oxygen работает Eclipse Photon.

Итак, в чем разница между двумя способами загрузки ресурсов?(Я слышал, что это что-то про ClassLoaders, но я не могу вспомнить точные слова.) Почему переключение на новую машину сломало первую?И даже со вторым я делаю это правильно?

1 Ответ

0 голосов
/ 11 сентября 2018

MyClass.class возвращает экземпляр java.lang.Class, представляющий класс MyClass.Вызов .getClass для этого возвращает экземпляр Class, представляющий собой java.lang.Class, и вызов getResourceAsStream для THAT попытается найти ресурс в java.base (где живет java.lang.Class).В общем, не то, что вы хотите.Другими словами, ваш первый пример такой же, как java.lang.Class.class.getResourceAsStream(...).

Второй пример - правильный способ сделать это.

Причина, по которой первое работает в нескольких местах, заключается в том, чтопотому что это точно, как Class.getResourceXXX был указан в Java SE 8 и старше.Спецификация изменена в Java SE 9 для работы с классами, где Class является именованным модулем.

...