Input/Output ImageIO kommt mit pic_url nicht klar

Reggi

Mitglied
Hallo zusammen,

ich bin gerade fleißig an Quaxlis Tutorial dran. Doch irgendwie muss ich was falsch gemacht haben :autsch:.
Ich bin an der Stelle, wo eigentlich das Fenster mit dem animierten Hubschrauber sein sollte.
Aber aus irgendeinem Grund gibt er eine IOException aus, die sich auf die Bild-URL bezieht. Fehlermeldung wie folgt:

Code:
Exception in thread "main" java.lang.IllegalArgumentException: input == null!
	at javax.imageio.ImageIO.read(ImageIO.java:1388)
	at spiel.SpielFeld.loadPics(SpielFeld.java:127)
	at spiel.SpielFeld.doInitializiations(SpielFeld.java:47)
	at spiel.SpielFeld.<init>(SpielFeld.java:38)
	at spiel.SpielFeld.main(SpielFeld.java:26)

Jetzt hab ich den Pfad überprüft und am Anfang hatte ich aus versehen einen falschen Ordner angegeben, weil ich nicht bedacht hab, dass ja jede IDE andere Bezeichnungen benutzt war also logisch. Aber jetzt lädt er die Bilder immernoch nicht. ;(
Hier mal die Klasse:
Java:
package spiel;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.ListIterator;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class SpielFeld extends JPanel implements Runnable {
    private static final long serialVersionUID = 1L;
    JFrame frame;
    long delta = 0;             //Berechnung der Zeit, die für den letzten Durchlauf benötigt wurde
    long last = 0;              //Speicherung der letzten Systemzeit
    long fps = 0;               //für Errechnung der FPS
    Sprite copter;
    Vector<Sprite> actors;
    Vector<Sprite> painter;
    
    public static void main (String [] args) {
        new SpielFeld (800,600);
    }
    
    //Fenster fürs Spiel erstellen
    public SpielFeld(int w, int h) {
        this.setPreferredSize(new Dimension(w,h));
        frame = new JFrame("Spieldemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(this);
        frame.pack();
        frame.setVisible(true);
        
        doInitializiations();
        
        Thread th = new Thread(this);
        th.start();
    }
    
    private void doInitializiations() {
        last = System.nanoTime();
        
        BufferedImage[] heli = loadPics("pics/heli.gif", 4);
        
        actors = new Vector<Sprite>();
        painter = new Vector<Sprite>();
        copter = new Sprite(heli,400,300,100,this);
        actors.add(copter);
    }
    
    //Gameloop
    @Override
    public void run() {
        while(frame.isVisible()) {
            computeDelta();                          //Methode zur Zeitberechnung
            
            //Methoden für die Spiellogik
            checkKeys();
            doLogic();
            moveObjects();
            cloneVectors();
            
            repaint();
            
            try {
                Thread.sleep(10);
            } catch ( InterruptedException e) {}
        }
    }
    
    @SuppressWarnings("unchecked")
    private void cloneVectors() {
        painter = (Vector<Sprite>) actors.clone();
    }
    
    private void computeDelta() {
        delta = System.nanoTime() - last;           //Errechnen der zeit für den Schleifendurchlauf in Nanosek
        last = System.nanoTime();                   //Speicherung der Aktuellen Systemzeit
        fps = ((long) 1e9/delta);                   //Errechnung der Framerate
    }
    
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        
        g.setColor(Color.red);
        g.drawString("FPS: " + Long.toString(fps), 20, 10);
        
        if (painter != null) {
            for (ListIterator<Sprite> it = painter.listIterator(); it.hasNext();) {
                Sprite r = it.next();
                r.drawObjects(g);
            }
        }
    }

    private void checkKeys() {
        
    }

    private void doLogic() {
        for(ListIterator<Sprite> it = actors.listIterator(); it.hasNext();) {
            Sprite r = it.next();
            r.doLogic(delta);
        }
    }

    private void moveObjects() {
        for(ListIterator<Sprite> it = actors.listIterator(); it.hasNext();) {
            Sprite r = it.next();
            r.move(delta);
        }
    }
    
    private BufferedImage[] loadPics(String path, int pics) {
        BufferedImage[] anim = new BufferedImage[pics];
        BufferedImage source = null;
        
        //URL pic_url = getClass().getResource("/pics/heli.gif");
        URL pic_url = getClass().getClassLoader().getResource(path);
        
        try {
            source = ImageIO.read(pic_url);
        } catch (IOException e) {}
        
        for(int x = 0; x < pics; x++) {
            anim[x] = source.getSubimage(x*source.getWidth()/pics, 0, source.getWidth()/pics, source.getHeight());
        }
        
        return anim;
    }
}

Irgendwas was ich übersehen hab oder findet er vllt einfach den path nicht?
 

bERt0r

Top Contributor
Also eine URL musst du natürlich absolut angeben, da läuft nix mit relativer Pfadangabe. Wenn du in den browser /index.html eingibst kommst du ja auch nicht auf deine wunschseite.
 

Reggi

Mitglied
Naja ich dachte eigentlich, dass das mit dem path so ist wie beim HTML, dass der einfach den Pfad relativ zur .class nimmt. Da muss ich ja auch nicht jedesmal den ganzen Pfad angeben. Und der Pfad muss dann in die
Java:
BufferedImage[] heli = loadPics("pics/heli.gif", 4);
?
 
G

Gast2

Gast
Schaut nicht so schlecht aus. Wobei es generell ne schlechte Idee ist bilder in den build ordner zu legen. Bei nem clean wird der kommentarlos geleert :)

Ich erstelle mir immer einen zusätzlichen source Folder der in der Regel resources heißt. In dem liegen dann alle Grafiken oder andere resource dateien. Da lässt sich dann einfach mit nem absoluten pfad drauf zugreifen (/images/image.png). Vielleicht hilft dir folgender link weiter:
Grafikdateien laden und anzeigen ? Byte-Welt Wiki
 

Reggi

Mitglied
Und wenn ich das richtig verstehe reicht als absoluter Pfad alles von Spiel/... abwärts aus?
Weil wenn jemand anders jetzt mein Spiel hätte oder es fertig hab und als Programm starte dann kann es sich ja auch woanders als in dem Laufwerk sein, wo ich es jetzt habe.
 

Reggi

Mitglied
Also ich hab jetzt nochmal alles durchgeschaut und zumindest verstanden wie alles zusammenhängt.
Nun mal meine Gedanken dazu:

Java:
private BufferedImage[] loadPics(String path, int pics) {
        BufferedImage[] anim = new BufferedImage[pics];
        BufferedImage source = null;
        
        URL pic_url = getClass().getClassLoader().getResource(path);
        
        try {
            source = ImageIO.read(pic_url);
        } catch (IOException e) {}
        
        for(int x = 0; x < pics; x++) {
            anim[x] = source.getSubimage(x*source.getWidth()/pics, 0, source.getWidth()/pics, source.getHeight());
        }
        
        return anim;
Das ist die Methode, die das Bild laden soll und in ein BufferedImage Array stecken und nach einander aufrufen soll.
Sie erwartet die Parameter String path (das wäre dann also die Pfadangabe) und int pics (die Anzahl von Bildern im Array).

Den wichtigsten Parameter um den es hier geht bekommt die Methode über:
den Aufruf von:

Java:
BufferedImage[] heli = loadPics("heli.gif", 4);

@EikeB: Der Link war eigentlich ganz gut, allerding weiß ich wirklich nicht weiter, weil egal was ich angebe es ändert sich nichts.
Dann ist mir noch die erste Zeile der Fehlermeldung ins Auge gestoßen.
Exception in thread "main" java.lang.IllegalArgumentException: input == null!
Was ja eigentlich die Exception ist, die Quaxli mit
Java:
        if (painter != null) {
            for (ListIterator<Sprite> it = painter.listIterator(); it.hasNext();) {
                Sprite r = it.next();
                r.drawObjects(g);
            }
        }
verhindern wollte. Mit anderen Worten nochmehr ??? über meinem Kopf und was ich jetzt noch gefunden hab ist ein Tread:
http://www.java-forum.org/spiele-multimedia-programmierung/125480-probleme-beim-laden-images-tutorial-fuer-java-spiele.html
Da wird dieses Problem schon einmal behandelt und ich dachte grad hey cool endlich die Lösung.
Also hab ich die .getClassLoader() rausgenommen den kompletten Pfad in der loadPics Methode angegeben und....
es geht immernoch nicht ;(.

Weiß jemand einen Rat?
 

Reggi

Mitglied
Hallo zusammen,
nach einigen Tagen drüber schlafen und mich mit anderen Sachen beschäftigen hat geholfen.
Keine Ahnung, was er an der von Quaxli vorgeschlagenen pic/heli.gif auszusetzen hatte, auf jeden Fall hab ich den Ordner mit resources wieder in den .class -Ordner gezogen den Pfad auf
Java:
BufferedImage[] heli = loadPics("resources/heli.gif", 4);
zurückgeändert und aufeinmal gehts :bahnhof:.
Wer weiß vllt hat er einfach irgendwas gehabt, wo man das Programm einfach neustarten musste. Danke auf jeden Fall EikeB für die nette Hilfe. Dein Link hat mir geholfen.

Ach und für alle Mitneulinge es gibt da ne ganz tolle Exception, die man sich vllt mit dazubauen sollte, dann weiß man wirklich wo der Fehler herkommt:

Java:
catch (IllegalArgumentException iae) {
            JOptionPane.showMessageDialog (this, 
            "Das Bild konnte nicht gefunden werden!",
            "java.lang.IllegalArgumentException",
            JOptionPane.ERROR_MESSAGE);
}

Und bei der IOException das gleiche mit konnte nicht geladen werden und schon sieht man besser wo der Fehler liegt. Ich hoffe das hilft einigen weiter. :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Bild in Jar-File mit ImageIO Java Basics - Anfänger-Themen 50
H Input/Output ImageIO.load frisst meinen ganzen Speicher weg! Java Basics - Anfänger-Themen 4
R ImageIO.read Fehler Java Basics - Anfänger-Themen 4
M Probleme mit ImageIO Java Basics - Anfänger-Themen 11
M Pfad angabe bei getRescource und ImageIO.write Java Basics - Anfänger-Themen 4
B Exception bei ImageIO wegen sonderzeichen Java Basics - Anfänger-Themen 11
G Lesefehler von ImageIO! Java Basics - Anfänger-Themen 7
G ImageIO.write() Java Basics - Anfänger-Themen 2
D ImageIO metadata auslesen aus png image Java Basics - Anfänger-Themen 2
I ImageIO.write(bild, "was gibts da alles", pfad); Java Basics - Anfänger-Themen 6
F javax.imageio.ImageIO write methode Java Basics - Anfänger-Themen 11
P Wie kann ich meine Keylistener Klasse unterscheiden lassen, von welcher "Quelle" der Input kommt? Java Basics - Anfänger-Themen 2
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
R Anfänger: Ausgabe kommt minus raus? Java Basics - Anfänger-Themen 6
P Probleme mit JUnit-Tests, es kommt was anderes raus als bei manuellen Tests Java Basics - Anfänger-Themen 5
S Wohin kommt das „abstract“? Vor oder nach „public“/ „private“ /... Java Basics - Anfänger-Themen 3
E Was kommt in ein Objekt und was in die Main Methode? Java Basics - Anfänger-Themen 8
G Woher kommt diese Eigenschaft Java Basics - Anfänger-Themen 5
D Woher kommt die 48?! Wie setz ich den Anfangswert auf 0??? Java Basics - Anfänger-Themen 8
I Schleife fragt Wert ab bis 0 kommt (mit IO.java klasse) Java Basics - Anfänger-Themen 16
L Input/Output Wieso kommt diese Ausgabe? Java Basics - Anfänger-Themen 12
V Operatoren Warum kommt bei double bei den Nachkommastellen irgendwann eine 2?! (1.20000000000002) Java Basics - Anfänger-Themen 5
V Operatoren Warum kommt nicht das gewünschte Ergebnis dieser Operation? Java Basics - Anfänger-Themen 3
J Ein Objekt zurückgeben, was kommt dabei raus ? Java Basics - Anfänger-Themen 4
S button kommt durch bild Java Basics - Anfänger-Themen 13
T Datum wird auf der Konsole richtig ausgegeben, aber im Textarea kommt ERROR Java Basics - Anfänger-Themen 8
Tacofan Hangman - ist der Buchstabe vorhanden wenn ja wo kommt er vor Java Basics - Anfänger-Themen 6
G Vertsändnisfrage zu Code - Wie kommt diese Ausgabe zustande? Java Basics - Anfänger-Themen 2
J BlueJ - kompilieren - und wie weit kommt man mit BlueJ? Java Basics - Anfänger-Themen 4
IngoF Welches Event kommt wann? Java Basics - Anfänger-Themen 8
S Kommt es zu Seiteneffekten wenn man waehrend den laufenden JUnit Tests den Code aendert? Java Basics - Anfänger-Themen 2
K Methoden ResultSet als Methodenübergabewert kommt leer an Java Basics - Anfänger-Themen 0
C For-Schleife wie kommt man auf die Lösung? Java Basics - Anfänger-Themen 2
M Erste Schritte Wie kommt man auf diese Ausgabe? Java Basics - Anfänger-Themen 3
K String kommt schon in Vector vor? Java Basics - Anfänger-Themen 36
A Input/Output Wo kommt das Newline her? Java Basics - Anfänger-Themen 7
A Wie kommt diese NullPointerException zustande? Java Basics - Anfänger-Themen 13
J Woher kommt das Objekt "Math" bei Math.random(); ? Java Basics - Anfänger-Themen 3
D Was kommt raus, wenn NaN mit einer Zahl verglichen wird? Java Basics - Anfänger-Themen 5
K Arraylisten auslesen, kommt nur Quatsch raus Java Basics - Anfänger-Themen 15
X JTable in JPanel in JTabbedPane mouseevent von jtable kommt nicht durch Java Basics - Anfänger-Themen 3
S Beim kompilieren kommt Ant Build.Was ist das? Java Basics - Anfänger-Themen 8
T TCP, Empfang nur wenn wirklich etwas kommt Java Basics - Anfänger-Themen 6
R Zeit kommt mir zu lange vor... Java Basics - Anfänger-Themen 7
A ArrayIndexOutOfBoundsException - woher kommt er?! Java Basics - Anfänger-Themen 4
eXistenZ Java-Boon kommt nicht zurrecht mit der Umsetzung einer Aufgabe... Java Basics - Anfänger-Themen 7
B Warum kommt immer die 0 als Ergebnis? Was habe ich falsch gemacht? Java Basics - Anfänger-Themen 18
J Woher kommt diese NullPointerException? Java Basics - Anfänger-Themen 6
I Warum kommt der Fehler? Minesweeper programmieren Java Basics - Anfänger-Themen 7
M Woher kommt der Funktionsaufruf? Java Basics - Anfänger-Themen 2
K Wieso kommt ne NullPointerException Java Basics - Anfänger-Themen 3
A nach if abfrage kommt fehler Java Basics - Anfänger-Themen 8
G JFileChooser kommt doppelt Java Basics - Anfänger-Themen 3
P Wieso kommt die Fehlermeldung ".class expected"? Java Basics - Anfänger-Themen 2
P Textdateischreiben, etwas fehlt noch bzw. 1 error kommt Java Basics - Anfänger-Themen 4
J Hilfe Java Hausaufgabe kommt nicht weiter Java Basics - Anfänger-Themen 5
H Server Client, es kommt nichts an. Java Basics - Anfänger-Themen 5
B Char kommt 2 mal im Wort vor (indexOf) Java Basics - Anfänger-Themen 5
B Woher kommt der Name Java? Java Basics - Anfänger-Themen 4
L Compilieren funktioniert, aber beim öffnen kommt nichts Java Basics - Anfänger-Themen 7
G Stringsuche: Wie häufig kommt String1 in Strin2 vor? Java Basics - Anfänger-Themen 7
U Wie oft kommt WertX int[] vor? Java Basics - Anfänger-Themen 2
frau-u StackOverflow - woher kommt es? Java Basics - Anfänger-Themen 7
G Java-1.5-Installation: warum kommt keine javac.exe mit? Java Basics - Anfänger-Themen 7
S die java machine läuft viel zuuuu langsam, woher kommt das?? Java Basics - Anfänger-Themen 3
A "Hello World"-Programm läuft nicht Java Basics - Anfänger-Themen 16
D Regex greift nicht richtig Java Basics - Anfänger-Themen 4
richis-fragen JTable den angezeigten WERT nicht den Wert aus dem Model ausgeben. Java Basics - Anfänger-Themen 3
richis-fragen JTable Header ausgeblendete (width = 0) nicht per mouseDragged aufziehen. Java Basics - Anfänger-Themen 9
M Ausgabe einer ArrayList ensteht nur als Hashcode, nicht als Objekt Java Basics - Anfänger-Themen 16
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
richis-fragen JTable effektiv angezeigter Text ausgeben nicht Inhalt vom Model Java Basics - Anfänger-Themen 9
S nach Import von jars (PLC4x) in Eclipse kann nicht mehr compiliert werden Java Basics - Anfänger-Themen 9
J Datenüberwachung funktioniert nicht Java Basics - Anfänger-Themen 9
S Wie debugge ich dies am besten: SingleThreadExecutor führt Task nicht aus..? Java Basics - Anfänger-Themen 29
H JDK installieren jdk-21 wird nicht erkannt Java Basics - Anfänger-Themen 13
N Klassen Hintergrundfarbe in JPanel ändert sich nicht Java Basics - Anfänger-Themen 3
K Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client) Java Basics - Anfänger-Themen 3
mo13 JTextField funktioniert nicht Java Basics - Anfänger-Themen 4
J .jar datei öffnen funktioniert nicht Java Basics - Anfänger-Themen 17
M Methode zielnah zeigt das gewünschte Ausgabe nicht an Java Basics - Anfänger-Themen 3
K Verstehe Rekursion nicht ganz Java Basics - Anfänger-Themen 7
M OOP Brüche nicht richtig berechnen Java Basics - Anfänger-Themen 3
N Ich kriege ganze zeit die Fehlermeldung "Inhalt der Zwischenablage kann nicht in die ausgewählten Elemente eingefügt werden" hat jemand eine Lösung? Java Basics - Anfänger-Themen 6
K TicTacToe belegtes feld nicht neu besetzbar Java Basics - Anfänger-Themen 1
K TicTacToe belegtes Feld nicht neu besetzbar Java Basics - Anfänger-Themen 3
A Warum wird mein jdk nicht gefunden? Java Basics - Anfänger-Themen 3
M Queue-Datenstruktur: nach dem Elementen entfernen, das Ergebnis ist immer noch nicht optimal. Java Basics - Anfänger-Themen 3
K Programm compilierbar aber nicht ausführbar... Java Basics - Anfänger-Themen 21
N Hey Leute und zwar versuche ich gerade ein 2D Spiel zu Programmieren aber die Figur will sich nicht nach links oder rechts bewegen :( Java Basics - Anfänger-Themen 12
G Mit jPackage erstellte EXE funktioniert nicht Java Basics - Anfänger-Themen 2
N BMI Rechner Was haltet ihr von dem Code habt ihr Verbesserungsvorschläge weil design teschnisch ist das nicht das geilste würde das gerne überarbeiten Java Basics - Anfänger-Themen 12
G Robot funktioniert nicht bei SelectionListener Java Basics - Anfänger-Themen 6
D MacOS: PDF erstellen geht nicht Java Basics - Anfänger-Themen 1
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
J jar Befehl wird nicht erkannt Java Basics - Anfänger-Themen 7
missy72 Erste Schritte (nicht) Deterministischer endlicher Automat Java Basics - Anfänger-Themen 9
T Getter/Setter - wie sieht ein Setter aus? Und wie nicht? Java Basics - Anfänger-Themen 34
T catch(InputMismatchException) wird nicht ausgefürt/erkannt Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben