2012-05-18 17 views
5

Quiero crear un cuadro de diálogo de entrada cuando se crea un nuevo registro y guardar la entrada del usuario como input en el archivo.Error al cancelar el showInputDialog

Aquí está el código:

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

Cuando no hay entrada del usuario o de cualquier entrada, el trabajo fino botón OK, pero si hago clic en el botón cancel, devuelve estos errores:

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) 

¿Cómo puedo resolverlo?

Respuesta

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

Gracias. Funciona bien. Perdón por mi pequeña pregunta. – Chin

+1

Puede ser útil mencionar que no todos los métodos 'JOptionPane.showInputDialog (...)' describen lo que se devuelve al cerrar el cuadro de diálogo si se hizo clic en el botón Cancelar. Solo el método con el mayor número de parámetros afirma devolver 'null' si se hizo clic en Cancelar. – Timmos

+0

@Timmos Buen punto. Los documentos de Java pueden ser un poco obtusos a veces, y "presumir" conocimiento que no es evidente para el usuario (nosotros). Casi puedo ver al programador ya que tenían el código fuente abierto y se les obligó a escribir comentarios sobre el código. Era "obvio" para ellos que cada versión más corta, llamada la versión más operandos con 'null' o valores predeterminados estándar, por lo que nunca * se les ocurrió * mencionar que en los documentos ... Estoy bastante seguro de que podemos suponer eso, pero sería bueno ver eso explícitamente documentado. O al menos la versión '@see 'esto se usa para más detalles ...' '. –

6

Si el usuario hace clic en "cancelar", input será nulo.

debe introducir el bloque de try sólo si el usuario hace clic en "ok" o se debe añadir un if para comprobar si input es nula antes de intentar usarlo!

Ahora, en realidad se puede desactivar el botón de cancelación con

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

o comprobar si el usuario hace clic en cancelar con

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

Gracias por la explicación. – Chin

Cuestiones relacionadas