2012-05-18 20 views
5

Chcę utworzyć okno dialogowe wprowadzania danych po utworzeniu nowego rekordu i zapisać w pliku dane wprowadzone przez użytkownika jako input.Błąd podczas anulowania showInputDialog

Oto kod:

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){} 

Gdy nie ma danych wejściowych użytkownika lub dowolny wejściowego, OK przycisk praca w porządku, ale jeśli kliknę przycisk cancel, zwraca te błędy:

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) 

Jak mogę to rozwiązać?

Odpowiedz

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

Dzięki. To działa dobrze. Ponownie przepraszam za moje małe pytanie. – Chin

+1

Może się przydać wspomnieć, że nie wszystkie metody 'JOptionPane.showInputDialog (...)' opisują, co jest zwracane po zamknięciu okna dialogowego po kliknięciu przycisku Anuluj. Tylko metoda z największą liczbą parametrów zwraca wartość 'null', jeśli kliknięto przycisk Anuluj. – Timmos

+0

@ Timmos Dobry punkt. Dokumenty Java mogą być czasami trochę tępe i "zakładać" wiedzę, która nie jest widoczna dla użytkownika (nas). Niemal widzę programistę, ponieważ miał otwarty kod źródłowy i (musiał) pisać komentarze do kodu. Było to dla nich "oczywiste" niż każda krótsza wersja, zwana bardziej operandową wersją z 'null' lub standardowymi wartościami domyślnymi - więc nigdy nie * wystąpiła *, aby wspomnieć o tym w dokumentach .. Jestem prawie pewien, że możemy założyć, że ale byłoby miło zobaczyć to wyraźnie udokumentowane. Lub przynajmniej "@see" wersja ta używa więcej szczegółów .. ". –

6

Jeśli użytkownik kliknie "anuluj", input będzie mieć wartość null.

Powinieneś wpisać blok tylko wtedy, gdy użytkownik kliknie "ok" lub powinieneś dodać if, aby sprawdzić, czy input ma wartość NULL, zanim spróbujesz go użyć!

Teraz rzeczywiście można wyłączyć przycisk anuluj

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

lub sprawdzania, czy użytkownik kliknął zrezygnować z

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

Dzięki za wyjaśnienie. – Chin

Powiązane problemy