2012-05-18 26 views
5

我想在創建新記錄時創建輸入對話框,並將用戶輸入保存爲input到文件中。取消showInputDialog時出錯

下面是代碼:

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

當沒有用戶輸入或輸入時,OK按鈕做工精細,但如果我點擊cancel按鈕,它會返回這些錯誤:

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) 

我該如何解決?

回答

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

由於取消禁用取消按鈕。它工作正常。對不起,我的小問題。 – Chin

+1

可能有一些用法提到,並非所有的'JOptionPane.showInputDialog(...)'方法都描述瞭如果點擊取消按鈕關閉對話框時返回的內容。如果單擊「取消」,只有參數數量最多的方法聲明返回「null」。 – Timmos

+0

@Timmos好點。 Java Docs有時可能會有些遲鈍,並且「假定」對用戶(我們)來說不明顯的知識。我幾乎可以看到程序員,因爲他們打開了源代碼並被迫(寫入)編寫代碼註釋。對他們來說,它比每個較短的版本都'顯而易見',被稱爲'null'或標準默認值的更多操作數版本 - 所以它從來不會*發生*讓他們在文檔中提到這一點..我確信我們可以假設,但是看到明確記錄的內容會很好。或者至少'@see'版本用於更多細節..''。 –

6

如果用戶點擊「取消」,input將爲空。

只有當用戶點擊「ok」或者您應該添加if以檢查input在嘗試使用它之前是否爲空時,您應該輸入try!現在

,你可以實際上

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

或檢查,如果用戶點擊了與

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

感謝您的解釋。 – Chin

相關問題