Fehlermeldungen bei Cancel FileChooser

Tempranillo

Mitglied
Hallo zusammen,

ich bin leider blutiger Anfänger und hoffe Ihr könnt mir helfen. Ich habe eine Methode Speichern in der ich den FileChooser verwende, klicke ich auf Cancel erscheinen haufenweise Fehlermeldungen, wie kann ich diese Abfangen? Bin über jeden Ansatz dankbar.
Grüße Dani

[CODE lang="java" title="Methode"]public void sichereTabelle(){//Speichert Tabelle in ein von dem User übergebenes Verzeichnis
JFileChooser fileauswahl = new JFileChooser();
fileauswahl.showDialog(null, "Gladiatorentabelle speichern");
File file = fileauswahl.getSelectedFile().getAbsoluteFile(); //Verzeichnis in das die Datei geschrieben
System.out.println(file);

try
{
FileWriter fw=new FileWriter(file);
for(int row=0;row<kampftabelle.getRowCount();row++)
{
StringBuilder sb=new StringBuilder();
for(int col=0;col<kampftabelle.getColumnCount();col++)
{
sb.append(kampftabelle.getValueAt(row,col)).append(";");
}
sb.append(System.getProperty("line.separator"));
fw.write(sb.toString());
}
fw.close();
}
catch(Exception e)
{
System.out.println("Schreibfehler: "+e.getMessage());
}
}[/CODE]

[CODE lang="java" title="Felermeldungen"]Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: Cannot invoke "java.io.File.getAbsoluteFile()" because the return value of "javax.swing.JFileChooser.getSelectedFile()" is null
at Projekt_v01.GUI_Gladiatoren.sichereTabelle(GUI_Gladiatoren.java:266)
at Projekt_v01.GUI_Gladiatoren$4.actionPerformed(GUI_Gladiatoren.java:130)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
at java.desktop/java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:297)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6614)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
at java.desktop/java.awt.Component.processEvent(Component.java:6379)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4990)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4822)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4919)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4548)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4489)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2769)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4822)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)[/CODE]
 
Also eine Methode aufzurufen, die etwas zurück gibt und dann die Rückgabe zu ignorieren ist oft ein Zeichen für einen Fehler.

ShowDialog gibt einen int zurück, den du dir merken und dann auswerten solltest:
Da wird auch beschrieben, was da zurück gegeben wird und auf was Du da prüfen kannst:
the return state of the file chooser on popdown:
  • JFileChooser.CANCEL_OPTION
  • JFileChooser.APPROVE_OPTION
  • JFileChooser.ERROR_OPTION if an error occurs or the dialog is dismissed
 
Der Aufruf von showDialog hat eine Rückgabe. Diese solltest du auswerten.

Und diese Abfrage ist doch so auch nicht zielführend mit dem &&, zum einen von der Logik her und zum anderen wirft die Zuweisung zu file doch schon die NPE, daher kommt die Prüfung schon zu spät.
 
Einfach noch einmal um es zu verdeutlichen: Eine Methode, die ein Ergebnis zurück gibt, sollte man auswerten. showDialog gibt - wie ich ja verlinkt habe, ein Ergebniscode zurück. Den kann (und sollte man!) auswerten. Das könnte so aussehen:

Java:
int rc = fileauswahl.showDialog(null, "Gladiatorentabelle speichern");
if (rc == JFileChooser.APPROVE_OPTION) {
  // Anwender hat etwas ausgewählt
}

Es mag zwar sein, dass man hier jetzt keine Unterscheidung braucht zwischen Cancel oder Error Ergebnis. Und da Du eine neue Instanz erzeugt hast, wird auch kein alter Zustand übertragen oder so ... (Sprich: Angenommen DU nutzt eine JFileChooser Instanz mehrfach - ist sicher gestellt, dass die Abfrage der Property null zurück gibt, wenn bei der zweiten Nutzung bei showDialog der Anwender abgebrochen hat? Habe ich nicht geprüft, aber das wäre im Augenblick meine Erwartungshaltung, da vor Aufruf ein ausgewähltes File vorgegeben werden kann...) Aber das sind halt alles so typische Fehlerquellen, denen Du Tür und Tor öffnest.

Daher ist und war meine Anregung ganz klar: Arbeite sauber. Wenn Du etwas machst, das einen Fehler signalisieren kann: Prüfe, ob ein Fehler vorliegt.

Aber das nur noch einmal als deutlicher Hinweis für Dritte, die diesen Thread lesen. Ich freue mich für Dich @Tempranillo, dass Du für Dich eine Lösung gefunden hast.
 

Zurück
Oben