Нужна помощь NullPointExceptionError - PullRequest
1 голос
/ 29 марта 2020

Я хотел бы применить значки к моей программе, но она выдает ошибку. Все выглядит хорошо, поэтому я понятия не имею, что с ним не так.

public static ImageIcon createIcon (String path) {
    URL url = System.class.getResource(path);

    if(url == null) {
        System.err.println("Unable to load image: " + path);
    }

    ImageIcon icon = new ImageIcon(url); //here is line 30 in class Utils

    return icon;
}

И его ошибка:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at java.desktop/javax.swing.ImageIcon.<init>(ImageIcon.java:217)
    at gui.Utils.createIcon(Utils.java:30)

1 Ответ

2 голосов
/ 29 марта 2020

Проблема в том, что url равно null. Проверьте, как был реализован конструктор:

public ImageIcon (URL location) {
    this(location, location.toExternalForm());
}

Если location равно null, location.toExternalForm() выдаст NullPointerException.

Фактически, если path равно null, это тоже может вызвать NullPointerException. Посмотрите, как getResource был реализован.

public URL getResource(String name) {
    name = resolveName(name);
    //...
}

private String resolveName(String name) {
    if (!name.startsWith("/")) {
        Class<?> c = this;
        while (c.isArray()) {
            c = c.getComponentType();
        }
        String baseName = c.getPackageName();
        if (baseName != null && !baseName.isEmpty()) {
            name = baseName.replace('.', '/') + "/" + name;
        }
    } else {
        name = name.substring(1);
    }
    return name;
}

Как видите, если name равно null, name.startsWith("/") выдаст NullPointerException.

Сделайте это следующим образом:

public static ImageIcon createIcon (String path) {
    if(path == null) {
        System.err.println("Path is null");
        return null;
    }

    URL url = System.class.getResource(path);
    ImageIcon icon = null;

    if(url != null) {
        icon = new ImageIcon(url);
    } else {
        System.err.println("Unable to load image: " + path);
    }

    return icon;
}
...