Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Ваша программа выйдет из строя, потому что RockPaperScissors.class.getResource("Rock.jpg")
не удалось найти указанный файл. Это также учитывает другие изображения, которые вы пытаетесь загрузить. Java пытается найти их в корневой папке проекта или в том же каталоге, что и файл JAR, когда вы превращаете свою программу в исполняемый JAR. Как вы указали, они находятся в той же папке, что и перечисление.
Я бы рекомендовал создать новую папку в корне вашего проекта под названием «res» и переместить все ваши файлы изображений в это папка. Затем замените:
new ImageIcon(RockPaperScissors.class.getResource("Rock.jpg"))
на:
new ImageIcon("res/Rock.jpg")
И сделайте это для каждого места, где вы загружаете изображения.
На несвязанной ноте , так как иконы переименования RockPaperScissors не должны меняться, лучше (и проще) сделать их общедоступными. Конечные переменные могут быть назначены только один раз и должны быть назначены при создании объекта. Таким образом, они действуют как константы. В коде:
public final ImageIcon icon;
private RockPaperScissors(ImageIcon icon) {
this.icon = icon;
}
И просто избавитесь от геттера и сеттера, теперь вы можете напрямую перейти к полю значка.