Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
An sich ist es richtig, dass unter Linux die Pfade anders lauten als unter Windows. So gibt es unter Linux keine Laufwerksbuchstaben und die Trennung zwischen Verzeichnissen in Pfadnamen erfolgt durch einen Slash ( / ) und nicht durch einen Backslash ( \ ).
Es wäre aber gut wenn du uns sagen könntest wo genau der Fehler aufkommt, bzw. was es für Fehlermeldungen gibt. Aussagen wie "Ich habe gehört, dass" hilft leider nicht dem Problem auf die Spur zu kommen.
Ok hier ein kleiner, wohl verantwortlicher, Teil des source codes:
Code:
public Dateien()
{
try
{
for (int i=0; i<4; i++)
{
farbe[i] = ImageIO.read(new File(gibVerzeichnis() + "/src/Data/ampel"+i+".gif"
}
auto = ImageIO.read(new File(gibVerzeichnis() + "/src/Data/auto.gif"));
radar = ImageIO.read(new File(gibVerzeichnis() + "/src/Data/radar1.gif"));
}
catch (IOException e)
{
e.printStackTrace();
}
bA = auto.getWidth(null); <-------- 40
hA = auto.getHeight(null);
}
public String gibVerzeichnis() throws IOException
{
File f = new File("."); //neuer lehrer Pfad
return f.getCanonicalPath(); //gebe den Pfad des Klassenordners zurck
}
beim compilen ist alles fitt. beim laufen lassen:
Exception in thread "main" java.lang.NullPointerException
at src.ampelsystem.Dateien.<init>(Dateien.java:40) siehe oben
at src.ampelsystem.Computer.<init>(Computer.java:65) heißt: DATA = new Dateien();
at src.ampelsystem.Main.main(Main.java:21)
Exception in thread "main" java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(ImageIO.java:1354)
at src.ampelsystem.Dateien.<init>(Dateien.java:27)
at src.ampelsystem.Computer.<init>(Computer.java:65)
at src.ampelsystem.Main.main(Main.java:21)
Nur damit nicht an der falschen Stelle gesucht wird: Datei- und Verzeichnisnamen sind unter Linux case-sensitive, was bei Windows nicht der Fall ist. Stimmt der Pfad im Programmcode auch bzgl. Groß-/Kleinschreibung mit dem überein, was unter Linux mit ls ausgegeben wird?
Und Murray hat völlig Recht, unter Linux sind Pfadangaben case-sensitive. Das heißt es kann in ein und demselben Verzeichnis die Datei Test.txt und test.txt geben. Unter Windows ist das nicht möglich. Du mußt also unbedingt darauf achten, dass die Groß- und Kleinschreibung stimmt.
Des weiteren ändern wir ja gerade die Art in der du Grafiken lädst. Bisher hast du sie direkt aus dem Dateisystem geladen, damit bekommst du später Schwierigkeiten sobald du dein Programm als .jar-Archiv ausliefern möchtest. Dann leigen die Dateien nicht mehr im normalen Dateisystem sondern in diesem Archiv. Das ist aber nicht weiter schlimm, Java macht es dir sogar besonders einfach dann diese Dateien zu nutzen.
Sogenannte "Resourcen", also alles das an deinem Programm was hinterher keine Class-Datei wird, lädst du wie oben beschrieben. Der Rückgabewert von Class.getResource(String) ist eine Klasse vom Typ URL die du überall dort einsetzen kannst wo statt eines Files auch eine URL verwendet werden kann. Bei ImageIO.read(URL) ist das so.
Die von dir angegebene Fehlermeldung bedeutet, dass an der entsprechenden Stelle keine Datei gefunden wurde. Die Methode gibVerzeichnis() verwenden wir an dieser Stelle bereits nicht mehr, wie dir sicher aufgefallen ist.
Um zu sehen wie genau der String lautet musst du dir den Verzeichnisbaum denes Projektes ansehen, und zwar ausgehend von der Klasse in der du das oben beschriebene angibst.
Nehmen wir an du hast eine Klasse A, und in dem selben Verzeichnis wie Klasse A liegt ein Bild namens test.gif und du möchtest das Bild laden, so heßt der Befehl:
Du müsstest also prüfen ob sich die Dateien die du laden möchtest wirklich im Unterordner /src/Data liegen.
Vom Gefühl her würde ich sagen: Es dürfte so sein, dass es den Unterordner /src nicht gibt weil die Klassen bereits darin liegen (falls du /src und /bin nicht getrennt hast). Das heisst ausgehend von der Klasse gibt es nur noch /Data
Versuch also einmal das ganze ohne src:
Code:
public Dateien()
{
try
{
for (int i=0; i<4; i++)
{
farbe[i] = ImageIO.read(this.getClass().getResource("Data/ampel"+i+".gif"));
}
auto = ImageIO.read(this.getClass().getResource("Data/auto.gif"));
radar = ImageIO.read(this.getClass().getResource("Data/radar1.gif"));
}
catch (IOException e)
{
e.printStackTrace();
}
bA = auto.getWidth(null);
hA = auto.getHeight(null);
}
Hast Du schon versucht, den ersten Slash in den Pfaden wegzulassen?
[EDIT: Oops, hier stand doch eben noch der geänderte Code zusammen mit der Aussage, dass es noch nicht funktioniert]