2012-05-18 9 views
5

Ich möchte ein Eingabedialogfeld erstellen, wenn ein neuer Datensatz erstellt wird, und die Benutzereingabe als input in der Datei speichern. HierFehler beim Abbrechen des showInputDialogs

ist der Code:

String input = JOptionPane.showInputDialog(null, "Enter name : ", "New Record!", 1);    //This to let user input name 
    try 
    { 
     JOptionPane.showMessageDialog(null, "Thanks for playing.", "Thanks", 1);   //Show this dialog after user input 
     HighestScoreFile.HighestScoreFile(input, hours, minutes, seconds, click);     //Store the data into a file, the `method` is in another class. 
    } 
    catch(IOException ex){} 

Wenn kein Eingang Benutzer oder jede Eingabe, die OK Taste Arbeit in Ordnung, aber wenn ich die cancel Schaltfläche klicken, gibt es diese Fehler:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at HighestScoreFile.HighestScoreFile(HighestScoreFile.java:22) 
    at MemoryGame$ButtonListener.actionPerformed(MemoryGame.java:329) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
    at java.awt.Component.processMouseEvent(Component.java:6505) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
    at java.awt.Component.processEvent(Component.java:6270) 
    at java.awt.Container.processEvent(Container.java:2229) 
    at java.awt.Component.dispatchEventImpl(Component.java:4861) 
    at java.awt.Container.dispatchEventImpl(Container.java:2287) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
    at java.awt.Container.dispatchEventImpl(Container.java:2273) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707) 
    at java.awt.EventQueue.access$000(EventQueue.java:101) 
    at java.awt.EventQueue$3.run(EventQueue.java:666) 
    at java.awt.EventQueue$3.run(EventQueue.java:664) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
    at java.awt.EventQueue$4.run(EventQueue.java:680) 
    at java.awt.EventQueue$4.run(EventQueue.java:678) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:677) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 

Wie kann ich es lösen?

Antwort

9
String input = .... 
if (input!=null) { ... 
+0

Dank Abbrechen geklickt hat. Es funktioniert gut. Entschuldigung nochmal für meine kleine Frage. – Chin

+1

Es kann von Nutzen sein, zu erwähnen, dass nicht alle 'JOptionPane.showInputDialog (...)' Methoden beschreiben, was beim Schließen des Dialogs zurückgegeben wird, wenn auf die Schaltfläche Abbrechen geklickt wurde. Nur die Methode mit der größten Anzahl von Parametern gibt an, dass 'null' zurückgegeben wird, wenn auf 'Abbrechen' geklickt wurde. – Timmos

+0

@Timmos Guter Punkt. Die Java-Dokumente können manchmal etwas stumpf sein und Wissen voraussetzen, das für den Benutzer (uns) nicht offensichtlich ist. Ich kann den Programmierer fast sehen, da sie den Quellcode geöffnet hatten und Codekommentare schreiben mussten. Es war ihnen "offensichtlich" als jede kürzere Version, die mehr Operanden-Version mit "Null" oder Standardvorgaben genannt wurde - also ist es ihnen nie * aufgefallen, das in den Dokumenten zu erwähnen. Ich bin ziemlich sicher, dass wir davon ausgehen können, aber es wäre schön, das explizit dokumentiert zu sehen. Oder zumindest '@see'-Version, die für mehr Details verwendet wird. –

6

Wenn der Benutzer auf "Abbrechen" klickt, wird input Null sein.

Sie sollten den try Block nur eingeben, wenn der Benutzer auf "OK" klickt oder Sie sollten einen if hinzufügen, um zu überprüfen, ob input null ist, bevor Sie versuchen, es zu verwenden!

Jetzt können Sie tatsächlich auf die Schaltfläche Abbrechen deaktivieren mit

JOptionPane.showInputDialog(null, "Enter name : ", "New Record!", JOptionPane.OK_OPTION); 

oder zu überprüfen, ob der Benutzer mit

if (input == null){ 
    // Do something 
} else { 
    try { 
    JOptionPane.showMessageDialog(null, "Thanks for playing.", "Thanks", 1); 
    HighestScoreFile.HighestScoreFile(input, hours, minutes, seconds, click); 
    } catch(IOException ex){} 
} 
+0

Danke für die Erklärung. – Chin