Fehler java.lang.IllegalArgumentException: input == null!

Ich habe einen einfachen Taschenrechner geschrieben, ich möchte nun im JFrame des Taschenrechners das Duke-Icon durch ein anderes Bild ersetzen. Ich bekomme beim laden meines Bildes aus dem Dateisystem immer folgenden Fehler: Exception in thread „AWT-EventQueue-0“ java.lang.IllegalArgumentException: input == null!
Ich habe vieles versucht, komme aber nicht weiter. Für einen Tipp, wie ich das Problem beheben kann, wäre ich dankbar.

BufferedImage icon = loadIcon();
setIconImage(icon);

private BufferedImage loadIcon() {
    try {
        URL iconUrl = getClass().getResource("C:\\Users\\mein\\Pfad\\x.ico");
        return ImageIO.read(iconUrl);
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

Du kannst alle möglichen Grafikformate für dein Icon verwenden, darunter bmp, gif, jpg/jpeg, png.
Normalerweise nutzte ich das PNG-Format, das funktioniert unter allen bekannten Betriebssystemen und das auch ohne zusätzliche Bibliothek.

Wenn Du unbedingt eine ico-Datei laden möchtest, brauchst du also Code, der die ico-Datei in von Java verwendbare Strukturen dekodiert. Das kann bspw. die BIbliothek Image4J erledigen, die du dann in Deinem Programm anzapfst. Mehr darüber findest Du hier: (image - How to read an ico format picture in java? - Stack Overflow)

Und nebenbei möchte ich noch einen Kommentar zu Deinem Code loswerden.
Schau Dir mal den Beitrag zum Laden von Grafikdateien aus unserem Wiki an, der wird Dir helfen, wirklich von Plattformen und Rechnern unabhängigen Code zu schreiben. Denn Dein Code würde nur auf deinem Rechner laufen.
https://wiki.byte-welt.net/wiki/Grafikdateien_laden_und_anzeigen_(Java)
Praktikabel ist es auch, Icons mit in die Jar-Datei deiner Anwendung aufzunehmen, so sind sie über relative Pfade immer einfach auf jedem Rechner erreichbar.

1 „Gefällt mir“

Man muss realistisch sein: Statt eine eigene Bibliothek einzubinden dürfte es in so einem Fall um Größenordungen einfacher sein, diese .ico-Datei mit einem x-beliebigen Programm oder auch einem der vielen online-Konverter in eine PNG-Datei zu verwandeln.

Vielen Dank für die Tipps. Ich habe es nun einfach wie folgt gelöst:

        String dir = System.getProperty("user.dir") + "\\img\\x.jpg";
        ImageIcon icon = new ImageIcon(dir);
        setIconImage(icon.getImage());

Hm, ich rede jetzt mal Tacheles, wenn es gestattet ist…

  • absolute Pfade zu verwenden ist ein No-Go
  • \ zu verwenden ist ein No-Go
  • Pfade manuell zusammenzufrömmeln ist ein No-Go
  • PNG s nicht zu verwenden ist ein No-Go
  • keine Fehlerbehandlung usw. ist ein No-Go

Von 5 Dingen, die man falsch machen kann, hast du 5 Dinge falsch gemacht. :confused:

Wenn du aber gerade erst anfängst oder lernst, lasse ich mildernde Umstände gelten…

Ich muss coffee_eater zumindest in Teilen zustimmen.
Absolute Pfade funktionieren (nicht immer aber) meist nur auf dem Rechner, auf dem das Programm geschrieben wurde.

Der Backslash ist als File-Separator nur unter Windows lauffähig. Linux und MacOS können damit auf Verzeichnisebene nichts anfangen. Es ist daher niemals falsch immer den Slash zu verwenden, denn der funktioniert auch unter Windows. Will man es noch weiter verbessern, nutzt man die Konstante, die von Java dafür ermittelt wird:
String fileSep = System.getProperty("file.separator");

Ich schlage vor, das Icon bzw. die Grafikdatei gleich mit ins Jar-Archiv der Anwendung zu packen und über relative Pfade die Grafik zu referenzieren. Auch dazu gibts im Wiki Beispiele.
Denn dann ist die Grafik immer beim Programm dabei und muss sie nicht extra noch ins System an die richtige Stelle kopieren, damit sie fehlerfrei geladen werden kann.

Und auch da hat coffee_eater Recht. Ohne ein wenig Exception Handling könnte es passieren, dass Du oder der Benutzer mal vor einem defekten Programm sitzt und nicht weißt, warum.
Es gibt vorgefertigte statische Dialoge (JOptionPane), die man ganz einfach mit den gerade passenden Ausgaben dem Benutzer präsentieren kann.
Auch dazu sollte sich etwas im Wiki finden lassen.

1 „Gefällt mir“

Hab’ hier mal ein bißchen durchgewischt.

@Belsharusur Wie du vielleicht gemerkt hast, ist coffee_eater ein Troll, der gerade einen Wimpernschlag vor der gefühlt 100sten Sperre steht. Wenn dir was auffällt, zögere nicht, den Beitrag zu melden.